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

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

Что такое триггер в 1С и как он работает

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

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

Термин «триггер» пришёл из мира баз данных, где триггером называют процедуру, срабатывающую при изменении таблицы. В 1С прямого аналога SQL-триггеров нет, поэтому под триггерами обычно понимают обработчики событий и подписки на события — механизмы, которые выполняют код при наступлении события в объекте конфигурации.

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

Что именно называют триггером в 1С

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

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

Где хранятся и как устроены обработчики событий

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

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

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

Какие события используют чаще всего

Набор событий зависит от типа объекта, но практически в каждой доработке встречаются одни и те же. Ниже — основные сценарии, где триггеры применяются ежедневно.

События записи и проведения

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

События формы

«ПриСозданииНаСервере» вызывается один раз при открытии формы — здесь инициализируют данные и настраивают видимость элементов. «ПриИзменении» у поля ввода позволяет реагировать на действия пользователя: пересчитать сумму при смене количества, подставить цену при выборе номенклатуры. «ПередЗаписью» формы отличается от события объекта тем, что работает только при интерактивной записи через форму — программная запись его не вызовет.

События заполнения

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

Логика при любом сохраненииМодуль объекта

События ПередЗаписью, ПриЗаписи, ОбработкаПроведения — работают и при интерактивной, и при программной записи

Реакция только в интерфейсеМодуль формы

ПриОткрытии, ПриИзменении поля, ПослеЗаписи — срабатывают только при работе пользователя с формой

Одна логика для многих объектовПодписка на событие

Обработчик в общем модуле, источник — несколько типов документов или справочников

Как создать свой триггер: пошаговый порядок

Допустим, нужно автоматически заполнять реквизит «Ответственный» у всех документов реализации при записи. Рассмотрим два способа: через модуль объекта и через подписку на событие. Второй предпочтительнее для типовых конфигураций на поддержке, потому что не меняет типовой код и упрощает обновления.

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

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

Пример обработчика в общем модуле выглядит так:

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

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

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

КонецЕсли;

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

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

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

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

Способы добавить триггер

Модуль объекта

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

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

Не меняет типовой код, один обработчик на много объектов; ограничена доступными событиями и параметрами

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

Переопределение обработчиков без снятия с поддержки; не все методы и формы можно расширить

Типичные ошибки и риски при работе с триггерами

Самая опасная ошибка — рекурсивный вызов. Если в обработчике «ПриЗаписи» объекта вызвать метод «Записать()» этого же объекта, событие сработает снова, и система уйдёт в бесконечный цикл вплоть до переполнения стека. Чтобы этого избежать, используют параметры записи, дополнительные свойства объекта («ДополнительныеСвойства») или флаг «ОбменДанными.Загрузка = Истина».

Вторая группа ошибок — производительность. Обработчик «ПриЗаписи» справочника «Номенклатура» срабатывает при каждой записи элемента, включая массовые обработки и обмены данными. Тяжёлый запрос внутри такого триггера умножается на тысячи срабатываний и способен остановить загрузку данных на часы. Любые запросы в обработчиках нужно минимизировать и выполнять только при реальном изменении контролируемых реквизитов.

Третья ловушка — обход логики при обмене. Многие обмены записывают объекты с установленным «ОбменДанными.Загрузка = Истина», и часть типовых проверок при этом не выполняется. Если ваш триггер должен работать и при обмене, это нужно предусмотреть явно; если не должен — добавьте проверку этого флага в начало обработчика.

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

Как проверить, что триггер работает правильно

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

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

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

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

Срабатывание при ручной записи
Норма

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

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

Событие не вызывается — проверьте источник подписки и обновление конфигурации

Программная запись и обмен
Норма

Логика работает или осознанно пропускается через ОбменДанными.Загрузка

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

Данные расходятся между ручным вводом и загрузкой

Повторная запись без изменений
Норма

Триггер не делает лишней работы, нет дублей связанных объектов

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

При каждой записи создаются дубли или выполняются тяжёлые запросы

FAQ: частые вопросы о триггерах в 1С

Чем триггер 1С отличается от триггера в SQL?

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

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

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

Почему мой обработчик «ПриЗаписи» не срабатывает?

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

Где лучше размещать проверку заполнения — в форме или в объекте?

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

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

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

Что делать, если триггер блокирует запись документов у всех пользователей?

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

Итог

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

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