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