Учимся писать код в 1С: путь от первой установки до рабочей процедуры
Содержание
Программировать в 1С можно начать за вечер: поставьте платформу, создайте пустую информационную базу, откройте её в Конфигураторе и напишите процедуру, которая выводит сообщение. Дальше всё упирается в практику: типы данных, запросы, формы, отладка.
Язык 1С русскоязычный, поэтому читается почти как обычный текст. Но за простым синтаксисом стоит большая платформа со своей логикой: справочники, документы, регистры, клиент-серверное взаимодействие. Её приходится осваивать параллельно с языком.
Ниже порядок, в котором удобно двигаться: среда, синтаксис, данные, запросы, формы, отладка. Примеры рассчитаны на платформу 8.3 с управляемыми формами.
Подготовка среды: что поставить и где писать код
Нужны три вещи: платформа 1С:Предприятие, база для экспериментов и Конфигуратор.
Для обучения подойдёт учебная версия платформы. Её можно скачать бесплатно, она рассчитана на изучение и не требует аппаратного ключа. Вместе с платформой устанавливают учебную конфигурацию или берут демо-базу типовой конфигурации.
Дальше:
- Запустите 1С, в окне запуска нажмите «Добавить» и создайте новую базу из шаблона или пустую.
- Выберите созданную базу в списке и нажмите «Конфигуратор».
- В Конфигураторе откройте дерево конфигурации: меню
Конфигурация → Открыть конфигурацию.
В дереве лежат все объекты: справочники, документы, обработки, отчёты, регистры. Код живёт в модулях этих объектов.
Тренируйтесь на отдельной пустой базе или на копии. Типовую конфигурацию на поддержке без нужды не правят: при обновлении ваши изменения придётся переносить вручную.
С чего начать в Конфигураторе
Самый простой вход — внешняя обработка. Она не меняет конфигурацию, живёт отдельным файлом и открывается из любой базы.
- В Конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте форму: в дереве объекта найдите ветку «Формы» и создайте новую.
- На форме создайте команду, а в её обработчике напишите код.
Минимальный обработчик:
&НаКлиенте
Процедура Привет(Команда)
Сообщить("Привет из 1С");
КонецПроцедуры
Запустите отладку клавишей F5, откроется «1С:Предприятие» с вашей обработкой. Нажмите кнопку команды и увидите сообщение. Это уже полный цикл: написали, запустили, проверили.
Синтаксис языка 1С: переменные, условия, циклы, процедуры
Язык нечувствителен к регистру. Строки заканчиваются точкой с запятой. Комментарий начинается с //.
Переменные не нужно объявлять заранее, достаточно присвоить значение:
Имя = "Иван";
Возраст = 30;
Сумма = 1250.50;
Активен = Истина;
Условия и циклы
Если Возраст >= 18 Тогда
Сообщить("Совершеннолетний");
ИначеЕсли Возраст > 0 Тогда
Сообщить("Несовершеннолетний");
Иначе
Сообщить("Возраст указан неверно");
КонецЕсли;
Для Сч = 1 По 5 Цикл
Сообщить("Шаг " + Формат(Сч, "ЧГ=0"));
КонецЦикла;
Пока Сумма > 0 Цикл
Сумма = Сумма - 500;
КонецЦикла;
Обратите внимание на Формат(Сч, "ЧГ=0"). Число с текстом напрямую не склеивают: используйте Формат или СтрШаблон.
Процедуры и функции
Процедура выполняет действие, функция возвращает значение:
Функция СуммаСНДС(Сумма, Ставка)
Возврат Сумма + Сумма * Ставка / 100;
КонецФункции
Процедура ПоказатьИтог()
Сообщить(СтрШаблон("Итого: %1", СуммаСНДС(1000, 20)));
КонецПроцедуры
Для 1000 руб. и ставки 20% функция вернёт 1200.
Часть языка пока не нужна, но запомните названия: «Попытка … Исключение … КонецПопытки» для перехвата ошибок, «Перем» для переменных модуля, директивы компиляции вроде &НаКлиенте и &НаСервере (о них ниже).
Типы данных и коллекции: массив, структура, таблица значений
Почти вся прикладная работа — это перекладывание данных между коллекциями. Основные пять.
| Коллекция | Когда нужна | Пример создания |
|---|---|---|
| Массив | Список однотипных значений | Новый Массив |
| Структура | Набор именованных полей, как «карточка» | Новый Структура("Имя, Возраст", "Иван", 30) |
| Соответствие | Поиск по ключу: код → значение | Новый Соответствие |
| Список значений | Выбор в формах, значения с представлением | Новый СписокЗначений |
| Таблица значений | Данные с колонками, как маленькая таблица | Новый ТаблицаЗначений |
Массив и обход через «Для каждого»
Города = Новый Массив;
Города.Добавить("Москва");
Города.Добавить("Казань");
Города.Добавить("Омск");
Для Каждого Город Из Города Цикл
Сообщить(Город);
КонецЦикла;
Индексация массива начинается с нуля: Города[0] вернёт «Москва».
Структура и соответствие
Клиент = Новый Структура;
Клиент.Вставить("Имя", "ООО Ромашка");
Клиент.Вставить("ИНН", "7700000000");
Сообщить(Клиент.Имя);
Остатки = Новый Соответствие;
Остатки.Вставить("Болт М8", 120);
Остатки.Вставить("Гайка М8", 300);
Сообщить(Остатки.Получить("Болт М8"));
Структуру удобно передавать в функцию как набор параметров, а не тянуть десять аргументов.
Таблица значений
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Товар");
Таб.Колонки.Добавить("Количество");
Строка = Таб.Добавить();
Строка.Товар = "Болт М8";
Строка.Количество = 100;
Строка = Таб.Добавить();
Строка.Товар = "Гайка М8";
Строка.Количество = 250;
Таб.Сортировать("Количество Убыв");
Для Каждого Стр Из Таб Цикл
Сообщить(Стр.Товар + ": " + Формат(Стр.Количество, "ЧГ=0"));
КонецЦикла;
Результат запроса часто выгружают именно в таблицу значений методом Выгрузить().
Ссылки и объекты
В базе данные хранятся в справочниках, документах, регистрах. Элемент справочника в коде представлен ссылкой (СправочникСсылка.Номенклатура). Чтобы изменить элемент, ссылку превращают в объект:
Объект = Ссылка.ПолучитьОбъект();
Объект.Наименование = "Новое имя";
Объект.Записать();
Новый элемент создают так: Объект = Справочники.Номенклатура.СоздатьЭлемент();, затем заполняют реквизиты и вызывают Записать().
Запись в базу из тестового кода делайте только на учебной базе. Ошибка в цикле по справочнику легко испортит тысячи элементов.
Язык запросов 1С: как читать данные из базы
Данные из базы выбирают запросом. Его синтаксис похож на SQL, только слова русские, а таблицы называются по именам объектов конфигурации: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг.
Полный цикл выглядит так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
| И Номенклатура.Наименование ПОДОБНО &Маска
|УПОРЯДОЧИТЬ ПО
| Наименование";
Запрос.УстановитьПараметр("Маска", "%болт%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " (" + Выборка.Артикул + ")");
КонецЦикла;
Что здесь важно:
- 🔹 Каждая строка текста запроса после первой начинается с вертикальной черты
|. - 🔹 Значения подставляют через параметры (
&Маска), а не склеивают в строку: так нет ошибок с кавычками и датами. - 🔹
ПОДОБНОищет по маске, где%— любое число символов. - 🔹 Результат читают через
Выбрать()и циклПока Выборка.Следующий().
Если нужна именно таблица, пишите Таб = Запрос.Выполнить().Выгрузить();.
Что обязательно освоить дальше
- Соединения:
ЛЕВОЕ СОЕДИНЕНИЕ,ВНУТРЕННЕЕ СОЕДИНЕНИЕ. - Группировка:
СГРУППИРОВАТЬ ПОс функциямиСУММА,КОЛИЧЕСТВО. - Виртуальные таблицы регистров, например
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата). - Временные таблицы и менеджер временных таблиц.
Для отладки текстов запросов программисты используют внешнюю обработку «Консоль запросов»: она позволяет вводить запрос и сразу видеть результат. Найдите её в открытых источниках сообщества 1С и проверьте перед запуском: такие обработки исполняют код в вашей базе.
Не пишите запрос внутри цикла по другому запросу. Один запрос с соединением почти всегда быстрее сотни запросов в цикле.
Программирование форм: события и клиент-серверное взаимодействие
В управляемых формах код делится на клиентский и серверный. Это главная особенность, которую новички путают первой.
Каждая процедура формы помечается директивой:
| Директива | Где выполняется | Что можно |
|---|---|---|
&НаКлиенте | На компьютере пользователя | Работать с интерфейсом, показывать сообщения, вызывать сервер |
&НаСервере | На сервере, с доступом к форме | Читать и писать данные базы, запросы |
&НаСервереБезКонтекста | На сервере, без данных формы | То же, но быстрее: на сервер не передаётся состояние формы |
Клиентская процедура не может выполнить запрос к базе напрямую. Она вызывает серверную, а та возвращает результат.
&НаКлиенте
Процедура ПоказатьКоличество(Команда)
Количество = КоличествоТоваров();
Сообщить("Всего товаров: " + Формат(Количество, "ЧГ=0"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция КоличествоТоваров()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Количество;
КонецФункции
События формы и элементов
Обработчики событий создают в свойствах формы или элемента (кнопка «Открыть» рядом с нужным событием). Платформа сама добавит пустую процедуру в модуль формы.
Самые частые:
- 🔹
ПриСозданииНаСервере— настройка формы до показа: условное оформление, значения по умолчанию. - 🔹
ПриОткрытии— действия на клиенте после показа формы. - 🔹
ПриИзмененииу поля — реакция на ввод пользователя. - 🔹
ПередЗаписьюиПриЗаписи— проверки и заполнение при записи объекта. - 🔹
ОбработкаПроверкиЗаполнения— свои проверки обязательных полей.
Проверка на лету выглядит так:
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
Если Объект.Количество < 0 Тогда
Сообщить("Количество не может быть отрицательным");
КонецЕсли;
КонецПроцедуры
Для вызова серверного кода из события клиента делайте как в примере выше: клиентская процедура зовёт серверную функцию.
Отладка и поиск ошибок: как найти, где сломалось
Самый быстрый способ — отладчик. В Конфигураторе откройте модуль, поставьте точку останова на нужной строке клавишей F9 и запустите отладку через F5. Выполнение остановится на этой строке.
Что делать при остановке:
- Смотрите значения переменных: наведите курсор или откройте окно локальных переменных.
F10— шаг без захода в вызываемую процедуру.F11— шаг с заходом внутрь.Shift+F9— вычислить произвольное выражение при остановке.F5— продолжить до следующей точки останова.
Если платформа показала ошибку, читайте текст целиком. В нём обычно есть имя модуля, номер строки и описание: «Поле объекта не обнаружено», «Переменная не определена», «Значение не является значением объектного типа ».
Типичные причины ошибок начинающих
| Сообщение | Вероятная причина |
|---|---|
| «Поле объекта не обнаружено» | Опечатка в имени реквизита или колонки |
| «Переменная не определена» | Имя написано с ошибкой или значение не присвоено |
| «Значение не является значением объектного типа» | Вместо объекта пришло Неопределено, пустая ссылка |
| «Недопустимое значение параметра» | В метод передан не тот тип данных |
| Запрос не выполняется | Нет ` |
Для вывода промежуточных значений быстрее всего Сообщить(...). Для проверки пустой ссылки используйте ЗначениеЗаполнено(Значение): она корректно работает с Неопределено, пустой строкой, нулём и пустой ссылкой.
Для перехвата ошибки используйте Попытка … Исключение. Текст ошибки получите через ОписаниеОшибки():
Попытка
Объект.Записать();
Исключение
Сообщить("Не удалось записать: " + ОписаниеОшибки());
КонецПопытки;
Не оставляйте пустое «Исключение» без вывода сообщения. Ошибка пропадёт, а причина останется неизвестной.