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