Разработка и Конфигурация · 10 мин
Обработчик события в 1С: как создать и настроить
Как создать обработчик события в 1С: подписки на события, обработчики формы и кнопок, примеры кода, типовые ошибки и проверка результата.
Обработчик события в 1С — это процедура или функция на встроенном языке, которая запускается платформой автоматически при наступлении определённого события: записи документа, нажатии кнопки, открытии формы, изменении реквизита. Понимание механизма событий — базовый навык для любой доработки конфигурации, потому что именно через обработчики внедряется прикладная логика: проверки, расчёты, заполнение полей, контроль прав.
Существует несколько уровней событий: события формы и её элементов, события объектов (модуль объекта, модуль менеджера), подписки на события и обработчики ожидания. У каждого уровня своё назначение и свои ограничения по контексту — например, в клиентском обработчике формы нельзя напрямую выполнять запросы к базе данных, а в подписке на событие недоступны элементы формы.
Ниже разобрано, как создать обработчик в конфигураторе, как выбрать правильное место для кода, как оформить подписку на событие и как проверить, что механизм работает корректно. Материал ориентирован на платформу 1С:Предприятие 8.3, но общие принципы одинаковы для всех современных версий.
Где живут события: форма, объект, подписка
Прежде чем писать код, нужно определить, к какому уровню относится задача. События формы (ПриОткрытии, ПриИзменении поля, Нажатие кнопки) обрабатываются в модуле формы и работают с интерфейсом. События объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) размещаются в модуле объекта и выполняются на сервере независимо от того, откуда идёт запись — из формы, из обмена или из фонового задания.
Подписка на событие — отдельный объект конфигурации, который позволяет привязать свой обработчик к событию сразу нескольких типов объектов, не изменяя их модули. Это основной способ доработки типовых конфигураций без снятия с поддержки: подписка добавляется поверх, а типовой код остаётся нетронутым.
Выбор уровня определяет поведение: если проверку нужно выполнять всегда, включая запись из обмена данными, размещайте её в модуле объекта или подписке, а не в форме. Обработчик в форме сработает только при интерактивной работе пользователя.
Создание обработчика события формы
Самый частый сценарий — реакция на действие пользователя в форме. Откройте конфигуратор, найдите нужный объект (например, документ), перейдите на закладку «Формы» и откройте форму. В окне редактора формы выделите саму форму (корень дерева элементов) или конкретный элемент — поле, кнопку, таблицу.
В палитре свойств перейдите к разделу «События» (значок молнии в некоторых версиях — список событий находится внизу палитры). Найдите нужное событие, например «ПриОткрытии» для формы или «ПриИзменении» для поля ввода, и нажмите кнопку открытия справа от поля. Платформа создаст в модуле формы заготовку процедуры с правильной сигнатурой и директивами компиляции.
- 1Откройте форму объекта в конфигураторе
- 2Выделите форму или элемент (поле, кнопку)
- 3В палитре свойств найдите раздел «События»
- 4Кликните по нужному событию — платформа создаст шаблон процедуры
- 5Впишите код между строками процедуры
- 6Сохраните конфигурацию и проверьте в режиме предприятия
Пример обработчика изменения поля с директивой компиляции:
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
Объект.Сумма = Объект.Количество * Объект.Цена;
КонецПроцедуры
Директива &НаКлиенте означает, что код выполняется на клиенте — здесь доступны элементы формы, но нельзя напрямую обращаться к базе запросами. Если внутри обработчика нужны данные из базы, вызывайте серверную процедуру с директивой &НаСервере.
Обработчики в модуле объекта
Модуль объекта содержит события жизненного цикла: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, ПриКопировании. Чтобы создать обработчик, откройте объект конфигурации, перейдите на закладку «Прочее» → «Модуль объекта» и выберите событие через меню «Конструкторы» → либо просто начните вводить имя процедуры — синтакс-помощник подскажет сигнатуру.
Ключевой параметр многих событий объекта — Отказ. Установка Отказ = Истина прерывает стандартную операцию: запись не выполнится. Это штатный механизм контроля: например, запретить проведение документа при отрицательном остатке.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если СуммаДокумента < 0 Тогда
Отказ = Истина;
Сообщить("Сумма документа не может быть отрицательной");
КонецЕсли;
КонецПроцедуры
Создание подписки на событие
Подписка создаётся в ветке «Общие» → «Подписки на события» дерева конфигурации. Добавьте новую подписку, задайте имя, затем в свойствах выберите: источник — типы объектов (можно несколько, например все документы), событие — например «ПриЗаписи», обработчик — процедура в общем модуле.
Обработчик подписки должен находиться в общем модуле с установленным флагом «Сервер» (для серверных событий записи). Процедура получает параметры события: для ПриЗаписи это Источник и Отказ. Источник — сам записываемый объект, к его реквизитам обращаются через точку.
// В общем модуле, флаг "Сервер" включён
Процедура КонтрольЗаписиДокументовПриЗаписи(Источник, Отказ) Экспорт
Если Источник.Организация.Пустая() Тогда
Отказ = Истина;
Сообщить("Не заполнена организация");
КонецЕсли;
КонецПроцедуры
Обработчики в расширениях конфигурации
Если конфигурация типовая и находится на полной поддержке, правильный путь — расширение. В расширении можно заимствовать форму и добавить обработчики к её событиям, а также создать собственные подписки на события. Для заимствованных обработчиков доступны аннотации: &Перед, &После, &Вместо — они определяют, как ваш код сочетается с типовым.
Аннотация &После означает, что ваша процедура выполнится после типовой; &Вместо полностью подменяет типовой обработчик — это мощный, но рискованный вариант: при обновлении конфигурации изменения типового кода не попадут в вашу подменённую процедуру автоматически.
Способы добавить обработчик в типовую конфигурацию
Подходит для серверных событий записи и проведения; не трогает типовой код; ограничение — нет доступа к форме
Подходит для событий форм и доработки интерфейса; переживает обновления; требует контроля совместимости при обновлении
Максимальная гибкость, но объект снимается с полной поддержки, обновления усложняются
Проверка работы и типичные ошибки
После создания обработчика обновите конфигурацию базы данных (F7) и проверьте сценарий в режиме предприятия. Для отладки поставьте точку останова внутри процедуры и запустите отладку — если точка не срабатывает, значит событие не наступает либо обработчик не привязан: проверьте, что в свойствах элемента выбрана именно ваша процедура, а для подписки — что состав источников включает нужный тип объекта.
Ещё одна частая проблема — рекурсия: обработчик ПриЗаписи изменяет объект и снова вызывает Записать(), что приводит к зацикливанию. Если запись внутри обработчика необходима, используйте ДополнительныеСвойства как флаг, чтобы пропустить повторную обработку.
Как проверить результат
Точка останова в отладчике останавливает выполнение при нужном действии
Отладчик не останавливается — событие не привязано или источник не совпадает
Код с директивой &НаКлиенте не содержит запросов к базе, серверный код не вызывает интерфейс
Ошибки вида «Процедура или функция не определена» или недоступности контекста
Контроль срабатывает при записи из обмена и фонового задания
Проверка работает только при ручной записи из формы
FAQ
Чем подписка на событие отличается от обработчика в модуле объекта?
Подписка — отдельный механизм, который вызывается платформой вместе с типовым событием и не требует изменения модуля объекта. Это позволяет дорабатывать типовые конфигурации без снятия с поддержки и привязывать один обработчик сразу к нескольким типам объектов.
Почему обработчик ПриИзменении поля не срабатывает?
Чаще всего процедура не привязана к событию в палитре свойств элемента формы, либо значение меняется программно — программное изменение реквизита формы не вызывает событие ПриИзменении. Проверьте привязку в свойствах поля и вызывайте обработчик явно из кода, если меняете значение программно.
Можно ли вызвать серверную процедуру из клиентского обработчика?
Да. Создайте в модуле формы процедуру с директивой &НаСервере и вызовите её из клиентского обработчика по имени. Учтите, что каждый серверный вызов — это обращение к серверу, поэтому при массовых операциях собирайте данные и вызывайте сервер один раз.
Как отменить запись документа из обработчика?
В событиях ПередЗаписью и ПриЗаписи установите параметр Отказ = Истина. Запись будет прервана, транзакция откатится. Желательно сообщить пользователю причину через Сообщить или вызвать исключение с понятным текстом.
Что выбрать для типовой конфигурации: расширение или подписку?
Для серверных проверок и действий при записи — подписку: она проще и стабильнее при обновлениях. Для событий формы и изменения интерфейса — расширение, так как подписки не имеют доступа к форме. Часто оба механизма применяются вместе.
Что важно запомнить
Обработчик события создаётся через палитру свойств формы, в модуле объекта или через подписку на событие. Уровень размещения определяет, когда код сработает: форма — только интерактивно, объект и подписка — при любой записи. Для типовых конфигураций используйте подписки и расширения, проверяйте привязку события отладчиком и избегайте интерактивных вызовов на сервере.