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

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

Обработчики событий в 1С: что это и как с ними работать

Что такое обработчики событий в 1С, какие виды существуют, как назначить обработчик форме, документу или подписке на событие. Примеры кода и типичные ошибки.

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

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

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

Как платформа находит и вызывает обработчик

Механизм основан на соглашении об именах. Платформа знает предопределённые имена событий — ПередЗаписью, ПриОткрытии, ОбработкаПроведения — и ищет процедуру с таким именем в соответствующем модуле. Если процедура объявлена, она выполняется; если нет — событие просто проходит без дополнительной логики.

Для событий формы и элементов управления привязка выполняется через палитру свойств: в конфигураторе вы выбираете событие в списке, платформа создаёт заготовку процедуры в модуле формы и связывает её с событием. Имя такой процедуры может быть произвольным (обычно формируется из имени элемента и события, например ТоварыКоличествоПриИзменении), связь хранится в свойствах элемента.

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

Основные группы событий и где объявлять обработчики

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

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

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

Группа событийГде объявляется обработчикТипичные события
Форма и её элементыМодуль формыПриОткрытии, ПриИзменении, Нажатие
Прикладной объектМодуль объектаПередЗаписью, ОбработкаПроведения
Набор записей регистраМодуль набора записейПередЗаписью, ПриЗаписи
ПриложениеМодуль управляемого приложенияПриНачалеРаботыСистемы
Подписка на событиеОбщий модульПередЗаписью, ПриПроведении для группы объектов

Обработчики формы и элементов управления

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

События элементов формы привязаны к действиям пользователя: ПриИзменении поля ввода, Нажатие кнопки, ПриАктивизацииСтроки и ПередУдалением табличной части, НачалоВыбора для полей со ссылочными типами. Через параметр Отказ или СтандартнаяОбработка можно подменить стандартное поведение — например, открыть собственную форму выбора вместо стандартной.

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

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

Обработчики объектов: запись и проведение документов

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

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

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

Клиент и сервер: контекст исполнения обработчиков

В управляемом приложении обработчики формы исполняются в разных контекстах, что обозначается директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Событие ПриСозданииНаСервере всегда серверное, ПриОткрытии — клиентское, а события элементов формы обычно клиентские.

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

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

Подписки на события: когда один обработчик нужен многим объектам

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

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

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

Модуль объекта или подписка на событие

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

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

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

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

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

Подходит для интерфейсной логики: видимость элементов, пересчёт итогов на форме, интерактивные вопросы. Не срабатывает при программной записи объекта без формы.

Пример обработчика и проверка его работы

Типовая задача — автоматический пересчёт суммы строки документа при изменении количества или цены. Обработчик назначается на событие ПриИзменении полей «Количество» и «Цена» табличной части «Товары».

&НаКлиенте

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

ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Возврат;

КонецЕсли;

ТекущиеДанные.Сумма = ТекущиеДанные.Количество * ТекущиеДанные.Цена;

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

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

Для отладки используйте точку останова в конфигураторе: запустите отладку, выполните действие в форме и убедитесь, что исполнение останавливается внутри обработчика. Если точка не срабатывает — обработчик не привязан к событию либо объявлен не в том модуле.

Типичные ошибки
01
Обработчик объявлен не в том модуле: событие объекта описано в модуле формы — платформа его не вызывает, и логика молча не работает.
02
Опечатка в имени предопределённой процедуры (ПередЗаписью написано иначе) — событие не перехватывается, ошибки компиляции нет, так как это обычная процедура.
03
Установлен Отказ = Истина без сообщения пользователю — запись документа не выполняется, а причина непонятна.
04
Серверный вызов в цикле по строкам табличной части из клиентского обработчика — форма заметно тормозит при большом числе строк.
05
Логика размещена только в обработчике формы — при программной записи объекта (обмен, обработка, фоновое задание) проверки и заполнение не выполняются.

Частые вопросы об обработчиках событий 1С

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

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

Почему обработчик ПередЗаписью в модуле объекта не срабатывает при записи из формы?

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

Можно ли нескольким событиям назначить один обработчик?

Да. В палитре свойств разные события (например, ПриИзменении количества и ПриИзменении цены) могут ссылаться на одну процедуру. Это удобно, когда реакция на разные события одинакова, — как в примере с пересчётом суммы строки.

Где размещать проверку заполнения реквизитов: в форме или в объекте?

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

Что делает параметр СтандартнаяОбработка?

Он позволяет отключить действие платформы по умолчанию. Если установить СтандартнаяОбработка = Ложь, платформа не выполнит своё стандартное поведение (например, не откроет стандартную форму выбора), и разработчик должен реализовать заменяющую логику самостоятельно.

Как отладить подписку на событие?

Поставьте точку останова в обработчике подписки в общем модуле и запустите отладку с предметом отладки «Сервер». Затем выполните действие, вызывающее событие (запись объекта-источника). Если точка не срабатывает, проверьте состав источника подписки и то, что общий модуль серверный и доступен в нужном контексте.

Итог

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

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