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