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