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

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

События в 1С: что это такое и как они работают

Что такое события в 1С: виды событий, обработчики, подписки на события, предопределённые процедуры модулей. Примеры кода, типичные ошибки и рекомендации разработчикам.

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

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

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

Что такое событие и обработчик события простыми словами

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

Обработчик события — это обычная процедура на встроенном языке 1С со строго определённым именем и набором параметров. Например, обработчик ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) получает параметр «Отказ»: если установить его в Истина, платформа прервёт запись документа. Так через параметры обработчик управляет поведением системы.

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

Основные виды событий в платформе 1С

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

События объектов данных

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

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

События форм и элементов формы

Управляемые формы имеют собственный набор событий: ПриСозданииНаСервере, ПриОткрытии, ПередЗаписью, ПослеЗаписи. Элементы формы (поля, таблицы, кнопки) генерируют события вроде ПриИзменении, НачалоВыбора, ОбработкаВыбора. Эти обработчики отвечают за интерактивное поведение интерфейса и выполняются на клиенте или на сервере в зависимости от директивы компиляции (&НаКлиенте, &НаСервере).

События приложения и сеанса

Модуль приложения содержит обработчики ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы, модуль сеанса — УстановкаПараметровСеанса. Они срабатывают один раз при старте или завершении работы пользователя и применяются для инициализации настроек, проверки прав, запуска фоновых задач.

Нужно проверить данные до сохраненияПередЗаписью / ОбработкаПроверкиЗаполнения

Можно отменить запись через параметр Отказ

Нужно сформировать движенияОбработкаПроведения

Работает только у документов с проведением

Нужно заполнить новый объектОбработкаЗаполнения

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

Нужно отреагировать на действие в формеПриИзменении / ПриОткрытии

Обработчики размещаются в модуле формы

Где размещаются обработчики: модули объектов, форм и менеджеры

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

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

Модуль формы — обработчики работают только пока открыта конкретная форма. Здесь размещают логику интерфейса: видимость элементов, пересчёт итогов на экране, подсказки пользователю. Ошибка новичков — писать критичные проверки только в форме: при программной записи объекта они не выполнятся.

Модуль менеджера объекта используется для обработчиков, не привязанных к конкретному экземпляру: ОбработкаПолученияФормы, ОбработкаПолученияДанныхВыбора. С их помощью настраивают, какая форма откроется и как работает быстрый подбор в полях ввода.

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

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

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

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

// Общий модуль "ПодпискиНаСобытия", процедура для подписки

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

Если Источник.ОбменДанными.Загрузка Тогда

Возврат;

КонецЕсли;

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

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

КонецЕсли;

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

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

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

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

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

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

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

Практические сценарии и примеры кода

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

Проверка данных перед записью

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если Скидка > 30 Тогда

ОбщегоНазначения.СообщитьПользователю(

"Скидка превышает допустимые 30%", , "Скидка", "Объект", Отказ);

КонецЕсли;

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

Такая проверка сработает при любой попытке записи — интерактивной и программной, — и надёжно заблокирует некорректный документ.

Автозаполнение при создании

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

Реакция на изменение поля в форме

Задача: при изменении количества пересчитать сумму строки. Это клиентское событие элемента формы ПриИзменении. Обработчик создаётся через палитру свойств элемента (кнопка с «лупой» у события) — конфигуратор сам сформирует шаблон процедуры с правильными директивами.

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

Как проверить и отладить срабатывание событий

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

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

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

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

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

Точка останова останавливает выполнение при нужном действии

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

Код не вызывается — проверьте модуль, имя процедуры и настройки подписки

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

Обмен проходит без ошибок, лишние проверки отключены через ОбменДанными.Загрузка

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

Обмен падает с ошибками из вашего обработчика

Поведение при программной записи
Норма

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

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

Логика работает только из формы — значит, она размещена не в том модуле

Ограничения и альтернативы

Механизм событий не всесилен. Подписки не позволяют изменить порядок штатных проверок платформы, нельзя подписаться на все существующие события — список ограничен (ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, ПередУдалением и несколько других). Для событий форм подписки не существует вовсе — там применяются расширения конфигурации с аннотациями &Перед, &После, &Вместо.

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

Итог

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

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

Часто задаваемые вопросы

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

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

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

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

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

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

Можно ли отменить событие или запись из обработчика?

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

Сколько подписок можно повесить на одно событие одного объекта?

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

Как добавить обработчик события формы в типовой конфигурации без её изменения?

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