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

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

Подписки на события в 1С: как работают и когда их применять

Подписки на события в 1С: принцип работы, настройка в конфигураторе, типовые события, примеры кода, ошибки и отличия от обработчиков формы.

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

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

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

Как устроен механизм подписок

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

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

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

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

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

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

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

Как создать подписку в конфигураторе

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

Порядок действий
  1. 1
    Создайте общий серверный модуль (например, «ПодпискиНаСобытия») с признаком «Сервер» и, при необходимости, «Вызов сервера».
  2. 2
    Добавьте в модуль экспортную процедуру обработчика с нужными параметрами: Процедура ПриЗаписиДокумента(Источник, Отказ) Экспорт.
  3. 3
    В дереве конфигурации откройте «Общие» → «Подписки на события» и добавьте новую подписку.
  4. 4
    В свойстве «Источник» выберите типы объектов (например, ДокументОбъект.РеализацияТоваровУслуг).
  5. 5
    В свойстве «Событие» укажите событие, например «ПриЗаписи».
  6. 6
    В свойстве «Обработчик» выберите созданную процедуру.
  7. 7
    Обновите конфигурацию базы данных и проверьте срабатывание на тестовом документе.

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

Пример обработчика с пояснениями

Типовая задача — при записи документа проверить условие и запретить запись, если оно не выполнено. Обработчик для события ПередЗаписью выглядит так:

Процедура ПроверкаЗаполненияОтветственногоПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

Если Не ЗначениеЗаполнено(Источник.Ответственный) Тогда

Отказ = Истина;

ВызватьИсключение "Не заполнен ответственный. Запись документа отменена.";

КонецЕсли;

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

Набор параметров процедуры должен точно соответствовать событию. Для ПередЗаписью документа это Источник, Отказ, РежимЗаписи, РежимПроведения; для ПриЗаписи — Источник, Отказ. Если состав параметров не совпадёт с ожидаемым платформой, возникнет ошибка вызова обработчика.

Другой частый сценарий — записать связанные данные в регистр сведений при записи справочника. Это делается в событии ПриЗаписи, чтобы запись регистра попала в ту же транзакцию: при откате записи элемента откатится и запись регистра.

Именуйте подписки и обработчики по схеме «что делаем + событие», например «ЗаполнитьОтветственногоПередЗаписью». Когда в конфигурации десятки подписок, поиск нужной по имени экономит заметное время, особенно при разборе ошибок из журнала регистрации.
ПЗ
Практическое замечание

Где подписки уместны, а где лучше другие средства

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

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

Сравнение вариантов

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

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

Код в модуле объекта

Для собственных объектов с уникальной логикой. Ограничение: для типовых объектов усложняет обновление конфигурации.

Расширение конфигурации

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

Регламентное задание

Для отложенной обработки (обмен, рассылка). Не подходит, если реакция нужна немедленно в момент записи.

Типичные ошибки и ограничения

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

Вторая группа проблем — рекурсия. Если в обработчике ПриЗаписи вызвать Записать() того же объекта, подписка сработает снова, и возникнет бесконечный цикл. Чтобы этого избежать, используйте ДополнительныеСвойства объекта: перед повторной записью добавьте туда признак и проверяйте его в начале обработчика.

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

Типичные ошибки
01
Неверный состав параметров обработчика — ошибка при каждой записи объекта, работа пользователей блокируется.
02
Вызов Записать() того же объекта внутри обработчика — рекурсивное срабатывание и зависание сеанса.
03
Общий модуль без признака «Сервер» — обработчик недоступен в серверном контексте, событие завершается ошибкой.
04
Внешние вызовы (HTTP, COM) внутри транзакции записи — длинные транзакции, блокировки и откаты при недоступности сервиса.
05
Молчаливое проглатывание исключений через Попытка/Исключение без журналирования — ошибки логики незаметны, данные расходятся.

Как проверить и отладить подписку

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

Если подписка срабатывает, но результат неверный, полезно временно добавить запись в журнал регистрации через ЗаписьЖурналаРегистрации с ключевыми данными объекта. Это помогает отличить «обработчик не вызвался» от «обработчик вызвался, но условие не выполнилось».

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

Как проверить результат

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

Точка останова в обработчике останавливает выполнение при записи объекта

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

Запись проходит без остановки — проверьте источник, событие и обновление конфигурации БД

Сигнатура процедуры
Норма

Параметры совпадают с описанием события в синтакс-помощнике

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

При записи возникает ошибка вызова обработчика

Производительность
Норма

Запись документа занимает примерно столько же времени, как до добавления подписки

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

Запись заметно замедлилась — в обработчике тяжёлые запросы или внешние вызовы

Поведение при отказе
Норма

При Отказ = Истина объект не записывается, пользователь видит понятное сообщение

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

Объект записывается несмотря на отказ или пользователь видит технический текст исключения

Порядок вызова нескольких подписок

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

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

FAQ

Можно ли подписаться на события формы, например на открытие формы документа?

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

Работают ли подписки при программной записи объекта из кода?

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

Что будет, если в обработчике возникнет исключение?

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

Можно ли отключить подписку без снятия конфигурации с поддержки?

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

Чем подписка отличается от обработчика в модуле объекта?

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

Сколько подписок можно создать — влияет ли их количество на производительность?

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

Итог

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

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