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

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

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

Что такое событие в 1С, какие бывают события формы, объекта и подписки на события, порядок их вызова и типичные ошибки разработчика при обработке.

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

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

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

Что такое событие и обработчик события

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

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

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

События формы: реакция на действия пользователя

События формы возникают только при интерактивной работе. Основные из них: ПриСозданииНаСервере (форма инициализируется на сервере, доступен объект данных), ПриОткрытии (форма готова к показу на клиенте), ПередЗаписью и ПослеЗаписи (интерактивная запись из формы), ПередЗакрытием и ПриЗакрытии.

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

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

События модуля объекта: запись, проведение, удаление

События модуля объекта срабатывают при любых операциях с данными — и интерактивных, и программных. Ключевая последовательность при записи документа с проведением: ПередЗаписью → ПриЗаписи → ОбработкаПроведения (или ОбработкаУдаленияПроведения). Для справочников проведения нет, поэтому цепочка короче.

Событие ОбработкаПроверкиЗаполнения вызывается, когда платформа проверяет обязательные реквизиты. Здесь добавляют свои проверки: если условие не выполнено, обработчик устанавливает Отказ = Истина и выводит сообщение. Это правильное место для контроля данных — оно сработает и из формы, и при программной записи, и при обмене данными.

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

Подписки на события: доработка без изменения типового кода

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

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

Порядок вызова: сначала выполняются обработчики подписок, затем — обработчик события в модуле самого объекта. Если несколько подписок назначены на одно событие, порядок их вызова не гарантирован, поэтому подписки не должны зависеть друг от друга. Обработчик подписки размещают в общем модуле с признаками «Сервер» и, при необходимости, «Вызов сервера».

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

Порядок вызова событий и проверка результата

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

Установка Отказ = Истина на любом этапе прерывает цепочку: последующие обработчики не выполняются, транзакция откатывается. Это удобно для контроля, но опасно при непонимании порядка — сообщение об ошибке может появиться из обработчика, который разработчик не ожидал.

Контрольные точки

Как проверить, что обработчик работает

Срабатывание обработчика
Норма

Точка останова в отладчике останавливает выполнение при нужном действии

Тревожный признак

Отладчик не останавливается — проверьте, тот ли это объект, событие и не снят ли флаг публикации модуля

Установка Отказ = Истина
Норма

Запись объекта прерывается, пользователь видит сообщение, данные в базе не меняются

Тревожный признак

Объект записывается несмотря на отказ — проверьте, в каком обработчике установлен параметр и не перезаписывается ли он дальше

Вызов подписки
Норма

Процедура общего модуля выполняется до обработчика в модуле объекта

Тревожный признак

Подписка не вызывается — проверьте состав источников и серверный контекст общего модуля

Типичные ошибки при работе с событиями

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

Вторая группа ошибок — тяжёлые операции в часто вызываемых событиях. Запрос к базе в обработчике ПриИзменении каждого поля или в событии ПриАктивизацииСтроки списка заметно тормозит работу пользователей. Такие обращения нужно кэшировать, объединять или переносить в менее частые события.

Типичные ошибки
01
Проверка данных только в форме — при программной записи контроль обходится, в базе появляются некорректные объекты.
02
Запросы и вызовы сервера в событии ПриИзменении — интерфейс начинает зависать при каждом редактировании поля.
03
Вызов Записать() внутри обработчика записи того же объекта — рекурсия и конфликт транзакций.
04
Зависимость одной подписки от результата другой — порядок вызова подписок не гарантирован, логика ломается непредсказуемо.
05
Доработка типового модуля объекта вместо подписки — при обновлении конфигурации изменения теряются или требуют ручного переноса.

Когда какой механизм выбирать

Маршрут решения

Как выбрать место для кода

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

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

Итог

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

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

Частые вопросы о событиях в 1С

Чем событие отличается от обработчика события?

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

Почему обработчик события не вызывается?

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

В каком порядке вызываются подписки и модуль объекта?

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

Можно ли отменить событие?

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

Где смотреть полный список событий объекта?

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

Что лучше для типовой конфигурации: расширение или подписка?

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