Программирование в Конфигураторе 1С 8.3: от первого модуля до отладки
Содержание
Код в 1С пишут в модулях объектов конфигурации: откройте базу в режиме Конфигуратор, выполните Конфигурация → Открыть конфигурацию, найдите в дереве нужный объект, щёлкните по нему правой кнопкой и выберите модуль (объекта, менеджера или формы). Откроется редактор, где пишут процедуры и функции на встроенном языке. Изменения сохраняют через Ctrl+S, а в базу применяют клавишей F7 — «Обновить конфигурацию
базы данных».
Типичная ситуация: бухгалтер просит, чтобы при проведении реализации программа проверяла заполнение договора. Новичок открывает Конфигуратор, видит сотни объектов и не понимает, куда вставить код и почему текст модуля не редактируется. Начинать надо не с кода, а с выбора места, где его можно писать без вреда для обновлений.
Подготовка: куда можно писать код, не ломая обновления
Первое препятствие — типовая конфигурация стоит на поддержке. Объекты в дереве помечены замком, текст модулей открывается только для чтения. Вариантов три.
| Способ | Когда подходит | Чем рискуете |
|---|---|---|
| Расширение конфигурации | Доработки типовой БП, ЗУП, УТ | Почти ничем: основная конфигурация не меняется |
| Внешняя обработка или отчёт | Разовые задачи, эксперименты, выгрузки | Ничем, файл .epf живёт отдельно от базы |
| Снятие с поддержки (включение изменений) | Собственная, глубоко переработанная конфигурация | Обновления придётся ставить через сравнение и объединение |
💡 Внешняя обработка — лучшая «песочница» для обучения. Файл → Новый → Внешняя обработка, добавьте форму, кнопку и пишите код. Сохраните файл и откройте его в режиме 1С:Предприятие через Файл → Открыть. Рабочая конфигурация при этом не меняется.
Расширения появились в платформе 8.3.6. Их список открывается через Конфигурация → Расширения конфигурации. В расширение заимствуют нужный объект типовой конфигурации и добавляют к его процедурам свой код с аннотациями &Перед, &После или &Вместо. Пример:
&После("ОбработкаПроверкиЗаполнения")
Процедура МояПроверкаЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Не ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
Сообщить("Не указан договор контрагента");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Если всё же решили менять основную конфигурацию, путь такой: Конфигурация → Поддержка → Настройка поддержки → кнопка Включить возможность изменения.
Перед изменением рабочей конфигурации выгрузите информационную базу в файл .dt (Администрирование → Выгрузить информационную базу). Применение изменений через F7, затрагивающее структуру данных, требует монопольного доступа: попросите пользователей выйти.
Редактор модулей: окно, горячие клавиши и настройки
Модули бывают разных видов, и место кода определяет, когда он выполнится.
- 📦 Модуль объекта — события конкретного документа или справочника:
ПередЗаписью,ОбработкаПроведения,ОбработкаПроверкиЗаполнения. - 🗂 Модуль менеджера — процедуры, которые работают с объектами типа в целом: печать, подготовка данных, без привязки к одному элементу.
- 🖼 Модуль формы — реакция на действия пользователя: нажатие кнопки, изменение поля, открытие формы.
- 🧩 Общий модуль (ветка
Общие → Общие модули) — функции, которые вызываются из разных мест. - ⚙️ Модуль сеанса и модуль управляемого приложения — код при старте сеанса и запуске клиента. Открываются из контекстного меню корня конфигурации.
Клавиши, без которых работа в редакторе идёт втрое медленнее:
| Действие | Клавиши |
|---|---|
| Контекстная подсказка (методы, свойства, переменные) | Ctrl+Пробел |
| Подсказка по параметрам метода | Ctrl+Shift+Пробел |
| Перейти к определению процедуры | F12 |
| Список процедур и функций модуля | Ctrl+Alt+P |
| Проверка синтаксиса модуля | Ctrl+F7 |
| Поиск и замена в модуле | Ctrl+F, Ctrl+H |
| Глобальный поиск по конфигурации | Ctrl+Shift+F |
| Перейти к строке по номеру | Ctrl+G |
| Синтакс-помощник | Ctrl+F1 |
Настройки редактора — Сервис → Параметры, вкладка Модули. Там задают ширину табуляции, автоотступ, работу контекстной подсказки и проверку синтаксиса при сохранении.
Два инструмента сильно облегчают жизнь. Синтакс-помощник — встроенный справочник по каждому методу с описанием параметров и доступности (клиент, сервер, внешнее соединение). Конструктор запроса вызывается из контекстного меню внутри строки текста запроса и собирает запрос мышью: выбираете таблицы, поля, условия, а текст генерируется сам.
💡 Шаблоны текста (Сервис → Шаблоны текста) ускоряют набор типовых блоков. Напишите Если, нажмите Ctrl+Q — вставится заготовка Если … Тогда … КонецЕсли;.
Встроенный язык 1С: синтаксис и устройство модуля
Модуль делится на три части, и их порядок фиксирован:
- Раздел объявления переменных —
Перем ИмяПеременной;в начале модуля. СловоЭкспортделает переменную доступной снаружи. - Раздел процедур и функций — основная часть.
- Раздел основной программы — операторы после последней процедуры. Выполняются при создании экземпляра модуля. Используется редко.
Код группируют областями — это упрощает навигацию и сворачивается в редакторе:
#Область ОбработчикиСобытий
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Сумма < 0 Тогда
Сообщить("Сумма не может быть отрицательной");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Основные правила синтаксиса:
- 🔹 каждый оператор заканчивается точкой с запятой
;; - 🔹 регистр букв не важен:
сообщитьиСообщить— одно и то же, но принято писать с заглавной; - 🔹 комментарий начинается с
//и действует до конца строки; - 🔹 строки — в двойных кавычках; кавычка внутри строки удваивается:
"Договор ""Основной"""; - 🔹 многострочная строка продолжается символом
|в начале каждой следующей строки; - 🔹 переменные не объявляют заранее: она создаётся при первом присваивании.
Процедура ничего не возвращает, функция возвращает значение через Возврат. Основные конструкции:
Функция СуммаСНДС(Сумма, Ставка = 20) Экспорт
Возврат Сумма + Сумма * Ставка / 100;
КонецФункции
// Цикл по числовому счётчику
Для Сч = 1 По 10 Цикл
Итог = Итог + Сч;
КонецЦикла;
// Цикл по коллекции
Для Каждого Строка Из Товары Цикл
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
// Обработка исключений
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Числа со строкой склеивайте через Формат(Число, "ЧГ=0") или СтрШаблон("Найдено %1 записей", Количество), иначе получите разделители разрядов и неожиданный вид чисел.
Обращение к справочникам, документам и регистрам из кода
Объекты метаданных доступны через менеджеры: Справочники, Документы, РегистрыСведений, РегистрыНакопления, Константы, Перечисления. Имя после точки — имя объекта в дереве конфигурации.
Создать и записать элемент справочника:
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Бумага А4";
НовыйЭлемент.Записать();
Найти и изменить: НайтиПоКоду() и НайтиПоНаименованию() возвращают ссылку. Ссылку можно читать, но не изменять. Чтобы изменить, получите объект:
Ссылка = Справочники.Номенклатура.НайтиПоКоду("00-00000015");
Если Не Ссылка.Пустая() Тогда
Объект = Ссылка.ПолучитьОбъект();
Объект.Наименование = "Бумага А4, 500 листов";
Объект.Записать();
КонецЕсли;
Прочитать константу и последний курс:
ОсновнаяВалюта = Константы.ВалютаРегламентированногоУчета.Получить();
ДанныеКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(),
Новый Структура("Валюта", Валюта));
Курс = ДанныеКурса.Курс;
Константа ВалютаРегламентированногоУчета и регистр КурсыВалют есть в типовых конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11). В своей конфигурации имена будут другими — смотрите дерево.
Запросы. Для выборки данных используйте язык запросов, а не перебор объектов. Запрос работает на сервере и читает только нужные поля:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(Реализация.Ссылка) КАК ЧислоДокументов
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &Контрагент
| И Реализация.Проведен";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
ЧислоДокументов = 0;
Если Выборка.Следующий() Тогда
ЧислоДокументов = Выборка.ЧислоДокументов;
КонецЕсли;
Значения передавайте только через параметры &Имя, а не склейкой строк: так запрос не ломается на кавычках в наименованиях и быстрее выполняется.
Клиент и сервер: директивы компиляции и вызовы сервера
В управляемом приложении код формы выполняется в двух местах: часть — на компьютере пользователя, часть — на сервере 1С. Где именно, задаёт директива перед процедурой.
| Директива | Где выполняется | Доступ к данным формы | Доступ к базе |
|---|---|---|---|
&НаКлиенте | У пользователя | Да | Нет |
&НаСервере | На сервере | Да, форма передаётся на сервер | Да |
&НаСервереБезКонтекста | На сервере | Нет | Да |
&НаКлиентеНаСервереБезКонтекста | И там, и там | Нет | Нет |
Правило практика: обработчик кнопки всегда &НаКлиенте, работа с базой — в серверной процедуре, и по возможности &НаСервереБезКонтекста. Такой вызов не тащит на сервер всю форму с табличными частями, поэтому быстрее.
&НаКлиенте
Процедура ПоказатьКоличество(Команда)
Число = КоличествоРеализаций(Объект.Контрагент);
ПоказатьПредупреждение(, СтрШаблон("Проведённых реализаций: %1", Число));
КонецПроцедуры
&НаСервереБезКонтекста
Функция КоличествоРеализаций(Контрагент)
Запрос = Новый Запрос(
"ВЫБРАТЬ КОЛИЧЕСТВО(Р.Ссылка) КАК ЧислоДокументов
|ИЗ Документ.РеализацияТоваровУслуг КАК Р
|ГДЕ Р.Контрагент = &Контрагент И Р.Проведен");
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.ЧислоДокументов, 0);
КонецФункции
Что нужно помнить о границе клиент — сервер:
- 🚫 на клиенте нельзя читать реквизиты ссылки через точку:
Объект.Контрагент.ИННв клиентской процедуре вызовет ошибку — получите ИНН серверной функцией; - 🚫 на клиенте нет запросов,
ПолучитьОбъект()и записи объектов; - 🔁 каждый вызов сервера из цикла — отдельный сетевой запрос; собирайте данные одним вызовом;
- 🧩 в общих модулях место выполнения задают флажки в свойствах: Клиент (управляемое приложение), Сервер, Вызов сервера, Внешнее соединение. Без флажка Вызов сервера серверную функцию общего модуля с клиента не вызвать.
Внутри одного модуля можно разграничить код инструкциями препроцессора #Если Сервер Тогда … #КонецЕсли.
Модальные окна (Предупреждение(), Вопрос()) в современных конфигурациях отключены: при вызове появится Использование модальных окон в данном режиме запрещено. Используйте ПоказатьПредупреждение(), ПоказатьВопрос() с описанием оповещения, а начиная с 8.3.18 — асинхронные функции с Асинх и Ждать.
Отладка кода в Конфигураторе
Отладчик запускается клавишей F5 (Отладка → Начать отладку): Конфигуратор откроет 1С:Предприятие, подключённое к отладке. Дальше работаете в программе как обычно, а выполнение останавливается на точках останова.
Основные команды:
| Команда | Клавиши |
|---|---|
| Поставить или снять точку останова | F9 |
| Шаг с заходом в процедуру | F11 |
| Шаг с обходом (без захода) | F10 |
| Выйти из текущей процедуры | Shift+F11 |
| Продолжить до следующей точки | F5 |
| Вычислить выражение | Shift+F9 |
| Табло (окно наблюдения) | Ctrl+Alt+W |
Во время остановки наведите курсор на переменную — увидите значение. Через Shift+F9 можно посмотреть содержимое таблицы значений, результата запроса или структуры и даже вычислить произвольное выражение, например Выборка.Количество().
Полезные приёмы:
- Остановка по ошибке. Включите её в меню
Отладка— отладчик сам встанет на строке, где возникло исключение, даже внутриПопытка. - Условная точка останова. В контекстном меню точки задайте условие (например,
Строка.НомерСтроки = 57), чтобы не пролистывать цикл вручную. - Замер производительности.
Отладка → Замер производительностипоказывает, сколько времени заняла каждая строка. Так находят запросы в цикле. - Отладка на сервере. В клиент-серверном варианте отладка серверного кода работает, только если на сервере 1С включена отладка: служба агента запускается с ключом
-debug. Изменение ключа требует перезапуска службы, а это оборвёт сеансы всех пользователей — делайте вне рабочего времени и только на тестовом сервере.
Как писать код, который не придётся переписывать
Частые ошибки начинающих, которые не ловит проверка синтаксиса, но потом тормозят базу:
- 🐢 Запрос в цикле. Сто строк документа — сто запросов. Передайте в запрос массив значений и условие
В (&Массив), получите всё за один раз. - 🐢 Обращение к реквизитам через точку на сервере в цикле.
Строка.Номенклатура.ЕдиницаИзмерениякаждый раз читает объект из базы. Получите нужные поля одним запросом. - 🔒 Запись в транзакции без отката. Если используете
НачатьТранзакцию(), в блокеИсключениеобязательно вызывайтеОтменитьТранзакцию(), иначе следующая запись упадёт с ошибкой. - 🧾 Молча проглоченные ошибки. Пустой блок
Исключениескрывает проблему. Минимум —ЗаписьЖурналаРегистрации()с текстомПодробноеПредставлениеОшибки(ИнформацияОбОшибке()). - ✏️ Правка типового кода вместо расширения. Каждая такая правка — конфликт при следующем обновлении.
Перед тем как отдать доработку, прогоните Конфигурация → Проверка конфигурации с включённой проверкой логической целостности и модулей в разных режимах (тонкий клиент, сервер). Она найдёт вызовы, которые на клиенте недоступны, — Ctrl+F7 этого не покажет, потому что проверяет только текущий модуль.
Если над конфигурацией работают двое и больше, подключите хранилище конфигурации (Конфигурация → Хранилище конфигурации): объекты захватываются на редактирование, и разработчики не затирают изменения друг друга.
Частые вопросы
Нужно ли знать английский, чтобы программировать в 1С?
Можно ли писать код 1С не в Конфигураторе?
Почему не активна команда «Обновить конфигурацию базы данных»?
Ctrl+S и повторите F7.Как сравнить свой код с тем, что был до правок?
Конфигурация → Сравнить конфигурации покажет различия основной конфигурации и конфигурации базы данных, вплоть до строк модуля.Где хранится код внешней обработки?
.epf. В базе его нет, пока обработку не добавят в справочник дополнительных отчётов и обработок.