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