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

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

События в 1С: как создать и использовать

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

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

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

Ниже разобрано, какие виды событий существуют, как создать обработчик и подписку в конфигураторе, какие ограничения нужно учитывать и как проверить, что код действительно отрабатывает.

Какие виды событий существуют в 1С

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

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

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

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

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

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

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

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

Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

КонецЕсли;

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

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

Создание подписки на событие в конфигураторе

Подписка на событие — основной инструмент доработки типовых конфигураций, потому что она не требует изменения типовых модулей. Порядок создания такой. Сначала создайте общий модуль: в дереве конфигурации раскройте ветку «Общие» → «Общие модули», добавьте новый модуль, например МоиПодпискиНаСобытия. В свойствах модуля установите флажок «Сервер», при необходимости «Вызов сервера»; флажок «Клиент» для подписок на запись не нужен.

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

Пример процедуры-обработчика подписки:

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

Если ТипЗнч(Источник) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда

// своя логика: например, заполнение комментария или проверка суммы

КонецЕсли;

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

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

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

Как выбрать между обработчиком в модуле и подпиской

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

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

Сравнение подходов

Обработчик в модуле объекта

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

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

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

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

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

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

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

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

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

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

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

Простейшая проверка — временно добавить в обработчик вывод сообщения: Сообщить("Событие сработало: " + Источник). После обновления конфигурации базы данных откройте объект нужного типа, измените данные и запишите. Сообщение должно появиться в окне сообщений. Для фоновых операций сообщения не видны — там используйте запись в журнал регистрации через ЗаписьЖурналаРегистрации.

Для глубокой проверки используйте отладчик конфигуратора: установите точку останова в обработчике, запустите отладку и выполните запись объекта. Если точка не срабатывает, проверьте: обновлена ли конфигурация БД, правильно ли выбран источник подписки, не стоит ли в начале обработчика условие, которое сразу завершает процедуру.

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

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

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

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

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

Точка не достигается — проверить источник подписки и обновление конфигурации БД

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

Параметры совпадают с событием (Источник, Отказ и далее по списку)

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

Ошибка при записи объекта с текстом о неверных параметрах

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

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

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

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

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

Можно ли создать своё собственное событие, а не использовать встроенные?

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

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

Чаще всего не обновлена конфигурация базы данных после добавления подписки, неверно выбран источник (записывается объект другого типа), общий модуль не имеет флажка «Сервер» или имя обработчика в свойствах подписки не совпадает с именем процедуры.

В чём разница между ПередЗаписью и ПриЗаписи?

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

Срабатывает ли подписка при обмене данными?

Да, подписки срабатывают при записи объектов любыми механизмами, включая обмены. Чтобы отличить загрузку, проверяйте свойство Источник.ОбменДанными.Загрузка — при Истина обычно пропускают бизнес-логику.

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

Штатного флажка отключения нет. Варианты: убрать подписку из конфигурации, добавить в начало обработчика условие-выключатель (например, константу «ОтключитьПодписки») или вынести подписку в расширение, которое можно отключить целиком.

Как добавить событие на форму документа?

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

Итог

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

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