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