К статье
Практический материал

Разработка и Конфигурация · 10 мин

Обработчик события в 1С: как создать и настроить

Как создать обработчик события в 1С: подписки на события, обработчики формы и кнопок, примеры кода, типовые ошибки и проверка результата.

Обработчик события в 1С — это процедура или функция на встроенном языке, которая запускается платформой автоматически при наступлении определённого события: записи документа, нажатии кнопки, открытии формы, изменении реквизита. Понимание механизма событий — базовый навык для любой доработки конфигурации, потому что именно через обработчики внедряется прикладная логика: проверки, расчёты, заполнение полей, контроль прав.

Существует несколько уровней событий: события формы и её элементов, события объектов (модуль объекта, модуль менеджера), подписки на события и обработчики ожидания. У каждого уровня своё назначение и свои ограничения по контексту — например, в клиентском обработчике формы нельзя напрямую выполнять запросы к базе данных, а в подписке на событие недоступны элементы формы.

Ниже разобрано, как создать обработчик в конфигураторе, как выбрать правильное место для кода, как оформить подписку на событие и как проверить, что механизм работает корректно. Материал ориентирован на платформу 1С:Предприятие 8.3, но общие принципы одинаковы для всех современных версий.

Где живут события: форма, объект, подписка

Прежде чем писать код, нужно определить, к какому уровню относится задача. События формы (ПриОткрытии, ПриИзменении поля, Нажатие кнопки) обрабатываются в модуле формы и работают с интерфейсом. События объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) размещаются в модуле объекта и выполняются на сервере независимо от того, откуда идёт запись — из формы, из обмена или из фонового задания.

Подписка на событие — отдельный объект конфигурации, который позволяет привязать свой обработчик к событию сразу нескольких типов объектов, не изменяя их модули. Это основной способ доработки типовых конфигураций без снятия с поддержки: подписка добавляется поверх, а типовой код остаётся нетронутым.

Выбор уровня определяет поведение: если проверку нужно выполнять всегда, включая запись из обмена данными, размещайте её в модуле объекта или подписке, а не в форме. Обработчик в форме сработает только при интерактивной работе пользователя.

Создание обработчика события формы

Самый частый сценарий — реакция на действие пользователя в форме. Откройте конфигуратор, найдите нужный объект (например, документ), перейдите на закладку «Формы» и откройте форму. В окне редактора формы выделите саму форму (корень дерева элементов) или конкретный элемент — поле, кнопку, таблицу.

В палитре свойств перейдите к разделу «События» (значок молнии в некоторых версиях — список событий находится внизу палитры). Найдите нужное событие, например «ПриОткрытии» для формы или «ПриИзменении» для поля ввода, и нажмите кнопку открытия справа от поля. Платформа создаст в модуле формы заготовку процедуры с правильной сигнатурой и директивами компиляции.

Порядок создания обработчика формы
  1. 1
    Откройте форму объекта в конфигураторе
  2. 2
    Выделите форму или элемент (поле, кнопку)
  3. 3
    В палитре свойств найдите раздел «События»
  4. 4
    Кликните по нужному событию — платформа создаст шаблон процедуры
  5. 5
    Впишите код между строками процедуры
  6. 6
    Сохраните конфигурацию и проверьте в режиме предприятия

Пример обработчика изменения поля с директивой компиляции:

&НаКлиенте

Процедура КоличествоПриИзменении(Элемент)

Объект.Сумма = Объект.Количество * Объект.Цена;

КонецПроцедуры

Директива &НаКлиенте означает, что код выполняется на клиенте — здесь доступны элементы формы, но нельзя напрямую обращаться к базе запросами. Если внутри обработчика нужны данные из базы, вызывайте серверную процедуру с директивой &НаСервере.

Обработчики в модуле объекта

Модуль объекта содержит события жизненного цикла: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, ПриКопировании. Чтобы создать обработчик, откройте объект конфигурации, перейдите на закладку «Прочее» → «Модуль объекта» и выберите событие через меню «Конструкторы» → либо просто начните вводить имя процедуры — синтакс-помощник подскажет сигнатуру.

Ключевой параметр многих событий объекта — Отказ. Установка Отказ = Истина прерывает стандартную операцию: запись не выполнится. Это штатный механизм контроля: например, запретить проведение документа при отрицательном остатке.

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если СуммаДокумента < 0 Тогда

Отказ = Истина;

Сообщить("Сумма документа не может быть отрицательной");

КонецЕсли;

КонецПроцедуры

Создание подписки на событие

Подписка создаётся в ветке «Общие» → «Подписки на события» дерева конфигурации. Добавьте новую подписку, задайте имя, затем в свойствах выберите: источник — типы объектов (можно несколько, например все документы), событие — например «ПриЗаписи», обработчик — процедура в общем модуле.

Обработчик подписки должен находиться в общем модуле с установленным флагом «Сервер» (для серверных событий записи). Процедура получает параметры события: для ПриЗаписи это Источник и Отказ. Источник — сам записываемый объект, к его реквизитам обращаются через точку.

// В общем модуле, флаг "Сервер" включён

Процедура КонтрольЗаписиДокументовПриЗаписи(Источник, Отказ) Экспорт

Если Источник.Организация.Пустая() Тогда

Отказ = Истина;

Сообщить("Не заполнена организация");

КонецЕсли;

КонецПроцедуры

Обработчики в расширениях конфигурации

Если конфигурация типовая и находится на полной поддержке, правильный путь — расширение. В расширении можно заимствовать форму и добавить обработчики к её событиям, а также создать собственные подписки на события. Для заимствованных обработчиков доступны аннотации: &Перед, &После, &Вместо — они определяют, как ваш код сочетается с типовым.

Аннотация &После означает, что ваша процедура выполнится после типовой; &Вместо полностью подменяет типовой обработчик — это мощный, но рискованный вариант: при обновлении конфигурации изменения типового кода не попадут в вашу подменённую процедуру автоматически.

Способы добавить обработчик в типовую конфигурацию

Подписка на событие

Подходит для серверных событий записи и проведения; не трогает типовой код; ограничение — нет доступа к форме

Расширение конфигурации

Подходит для событий форм и доработки интерфейса; переживает обновления; требует контроля совместимости при обновлении

Прямое изменение модуля

Максимальная гибкость, но объект снимается с полной поддержки, обновления усложняются

Проверка работы и типичные ошибки

После создания обработчика обновите конфигурацию базы данных (F7) и проверьте сценарий в режиме предприятия. Для отладки поставьте точку останова внутри процедуры и запустите отладку — если точка не срабатывает, значит событие не наступает либо обработчик не привязан: проверьте, что в свойствах элемента выбрана именно ваша процедура, а для подписки — что состав источников включает нужный тип объекта.

Типичные ошибки
01
Обработчик создан в форме, а проверка нужна и при обмене — логика не срабатывает; переносите контроль в модуль объекта или подписку
02
Забыт Экспорт у процедуры-обработчика подписки — платформа не находит метод, возникает ошибка вызова
03
Интерактивные вызовы (Вопрос, ОткрытьФорму) в серверном обработчике — ошибка выполнения на сервере
04
Обращение к реквизиту, которого нет у части источников подписки, — ошибка при записи этих объектов
05
Директива &amp;НаКлиенте у процедуры с запросом к базе — ошибка компиляции или выполнения

Ещё одна частая проблема — рекурсия: обработчик ПриЗаписи изменяет объект и снова вызывает Записать(), что приводит к зацикливанию. Если запись внутри обработчика необходима, используйте ДополнительныеСвойства как флаг, чтобы пропустить повторную обработку.

Контрольные точки

Как проверить результат

Срабатывание обработчика
Норма

Точка останова в отладчике останавливает выполнение при нужном действии

Тревожный признак

Отладчик не останавливается — событие не привязано или источник не совпадает

Контекст выполнения
Норма

Код с директивой &amp;НаКлиенте не содержит запросов к базе, серверный код не вызывает интерфейс

Тревожный признак

Ошибки вида «Процедура или функция не определена» или недоступности контекста

Поведение при обмене
Норма

Контроль срабатывает при записи из обмена и фонового задания

Тревожный признак

Проверка работает только при ручной записи из формы

FAQ

Чем подписка на событие отличается от обработчика в модуле объекта?

Подписка — отдельный механизм, который вызывается платформой вместе с типовым событием и не требует изменения модуля объекта. Это позволяет дорабатывать типовые конфигурации без снятия с поддержки и привязывать один обработчик сразу к нескольким типам объектов.

Почему обработчик ПриИзменении поля не срабатывает?

Чаще всего процедура не привязана к событию в палитре свойств элемента формы, либо значение меняется программно — программное изменение реквизита формы не вызывает событие ПриИзменении. Проверьте привязку в свойствах поля и вызывайте обработчик явно из кода, если меняете значение программно.

Можно ли вызвать серверную процедуру из клиентского обработчика?

Да. Создайте в модуле формы процедуру с директивой &НаСервере и вызовите её из клиентского обработчика по имени. Учтите, что каждый серверный вызов — это обращение к серверу, поэтому при массовых операциях собирайте данные и вызывайте сервер один раз.

Как отменить запись документа из обработчика?

В событиях ПередЗаписью и ПриЗаписи установите параметр Отказ = Истина. Запись будет прервана, транзакция откатится. Желательно сообщить пользователю причину через Сообщить или вызвать исключение с понятным текстом.

Что выбрать для типовой конфигурации: расширение или подписку?

Для серверных проверок и действий при записи — подписку: она проще и стабильнее при обновлениях. Для событий формы и изменения интерфейса — расширение, так как подписки не имеют доступа к форме. Часто оба механизма применяются вместе.

Итог

Что важно запомнить

Обработчик события создаётся через палитру свойств формы, в модуле объекта или через подписку на событие. Уровень размещения определяет, когда код сработает: форма — только интерактивно, объект и подписка — при любой записи. Для типовых конфигураций используйте подписки и расширения, проверяйте привязку события отладчиком и избегайте интерактивных вызовов на сервере.