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

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

Как работают подписки на события в 1С

Как работают подписки на события в 1С: источники, обработчики, порядок выполнения, типовые ошибки и проверка результата. Практическое руководство для разработчика.

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

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

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

Что такое подписка на событие и из чего она состоит

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

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

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

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

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

Различают события, выполняемые в транзакции записи (ПередЗаписью, ПриЗаписи, ОбработкаПроведения), и события вне транзакции (ОбработкаЗаполнения, ПриКопировании). Это важно: исключение внутри транзакционного события откатит всю запись объекта, а длительные операции в таком обработчике удерживают блокировки и мешают параллельной работе пользователей.

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

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

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

Порядок создания подписки
  1. 1
    Создайте общий модуль с флагами Сервер и, при необходимости, ВызовСервера; запретите привилегированный режим, если он не нужен.
  2. 2
    Добавьте объект метаданных: ветка Общие → Подписки на события → Добавить.
  3. 3
    В свойстве Событие выберите нужное событие, например ПередЗаписью.
  4. 4
    В свойстве Источник отметьте типы объектов, например нужные документы.
  5. 5
    В свойстве Обработчик нажмите кнопку выбора — платформа создаст заготовку процедуры в общем модуле с правильной сигнатурой.
  6. 6
    Напишите код обработчика, обновите конфигурацию базы данных и проверьте срабатывание на тестовом объекте.

Пример обработчика, который запрещает запись документа без комментария:

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

Если Не ЗначениеЗаполнено(Источник.Комментарий) Тогда

ОбщегоНазначения.СообщитьПользователю("Заполните комментарий перед записью документа.");

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

КонецЕсли;

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

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

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

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

Флаг Отказ пробрасывается по цепочке: если одна подписка установила его в Истина, последующие обработчики всё равно вызываются, но запись не состоится. Хорошая практика — в начале обработчика проверять Если Отказ Тогда Возврат;, чтобы не выполнять лишнюю работу и не перезаписывать сообщения об ошибках.

Подписки в расширениях и типовых конфигурациях

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

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

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

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

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

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

Обновление конфигурации БД
Норма

После F7 подписка видна в конфигурации базы данных

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

Подписка есть только в конфигураторе, изменения не применены

Факт вызова обработчика
Норма

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

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

Запись проходит, отладчик не останавливается — проверяйте источник и событие

Результат работы
Норма

Реквизиты заполнены или запись отклонена с понятным сообщением

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

Объект записывается без изменений, сообщений нет

Режим обмена данными
Норма

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

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

Подписка мешает обмену или, наоборот, молча не работает при загрузке

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

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

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

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

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

Итог

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

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

Частые вопросы

Можно ли одной подпиской обрабатывать разные документы?

Да, в свойстве «Источник» отмечается несколько типов. Обработчик должен быть универсальным: обращайтесь только к реквизитам, общим для всех источников, либо определяйте тип через ТипЗнч(Источник) и ветвите логику.

Почему подписка не срабатывает при загрузке данных из обмена?

Скорее всего, в обработчике есть проверка Источник.ОбменДанными.Загрузка с выходом из процедуры — так принято делать, чтобы не мешать обмену. Если логика нужна и при загрузке, уберите или скорректируйте эту проверку, но учтите риск побочных эффектов при массовой загрузке.

Что выполнится раньше: подписка или код в модуле объекта?

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

Можно ли из обработчика подписки записать другой документ?

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

Работают ли подписки в расширении конфигурации?

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

Как временно отключить подписку без удаления?

Штатного флага «включено/выключено» у подписки нет. Варианты: убрать источники в свойствах подписки, добавить в начало обработчика условие по функциональной опции или константе, либо исключить подписку из состава конфигурации при поставке. Удобнее всего управлять через константу-переключатель.