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

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

Что такое событие в 1С: виды, обработчики и практические примеры

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

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

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

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

Как устроена событийная модель 1С

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

Обработчик события — это обычная процедура или функция на встроенном языке, но с зарезервированным именем и фиксированным набором параметров. Например, обработчик ПередЗаписью у документа всегда получает параметры Отказ и РежимЗаписи. Если установить Отказ = Истина, платформа прервёт стандартную операцию — документ не запишется.

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

События формы: где обрабатывается работа пользователя

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

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

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

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

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

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

События объектов расположены в модулях объектов и модуле менеджера и срабатывают при программной и интерактивной работе с данными. Главные события документа: ОбработкаЗаполнения, ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаУдаленияПроведения, ОбработкаПроверкиЗаполнения.

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

bsl
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Если Не ЗначениеЗаполнено(Склад) Тогда
		Отказ = Истина;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не заполнен склад отгрузки";
		Сообщение.Поле = "Склад";
		Сообщение.УстановитьДанные(ЭтотОбъект);
		Сообщение.Сообщить();
	КонецЕсли;
КонецПроцедуры

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

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

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

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

Клиент и сервер: где выполняется обработчик

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

Директивы компиляции &НаКлиенте, &НаСервере, &НаСервереБезКонтекста определяют, где будет выполняться процедура. Процедуры БезКонтекста не имеют доступа к данным формы напрямую — данные нужно передавать параметрами, зато такие вызовы работают быстрее. Выбор директивы — не формальность: попытка обратиться к реквизиту формы из процедуры без контекста приведёт к ошибке исполнения.

Где размещать логику

Модуль формы (&НаКлиенте)

Интерактивные реакции: вопросы пользователю, управление видимостью, работа с файлами на компьютере пользователя. Не подходит для запросов к базе — это требует вызова сервера.

Модуль формы (&НаСервере)

Заполнение формы данными, чтение из базы при открытии. Работает только внутри вызова формы.

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

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

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

Сквозная логика для многих объектов и доработка типовых конфигураций без изменения типового кода.

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

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

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

Маршрут решения

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

Нужно запретить запись при некорректных данныхОбработкаПроверкиЗаполнения в модуле объекта с установкой Отказ = Истина
Нужно заполнить реквизиты нового объектаОбработкаЗаполнения в модуле объекта
Нужно настроить видимость элементов при открытииПриСозданииНаСервере в модуле формы
Нужно среагировать на изменение поля пользователемПриИзменении у элемента формы
Нужна одна реакция для многих типов документовПодписка на событие с обработчиком в общем модуле
Нужно действие после гарантированной записиПослеЗаписи в форме или ПриЗаписи в модуле объекта

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

Большинство проблем с событиями сводится к нескольким повторяющимся сценариям. Их знание экономит часы отладки: симптомы обычно одинаковые — «код не срабатывает», «код срабатывает дважды» или «документ невозможно записать».

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

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

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

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

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

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

Количество вызовов
Норма

Обработчик вызывается ровно один раз на одно действие

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

Многократные вызовы — возможна рекурсия или дублирование подписок

Контекст выполнения
Норма

Все обращения к данным формы доступны в процедуре

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

Ошибка «Переменная не определена» — неверная директива компиляции

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

Чем событие формы отличается от события объекта?

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

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

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

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

Да. В событиях ОбработкаПроверкиЗаполнения и ПередЗаписью есть параметр Отказ. Установка Отказ = Истина прерывает запись, при этом желательно вывести пользователю сообщение с причиной через объект СообщениеПользователю.

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

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

Где правильно проверять заполнение реквизитов документа?

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

Что такое ОбработкаПроведения и когда она вызывается?

Это событие документа, в котором формируются движения по регистрам. Оно вызывается при проведении документа после записи. Внутри обработчика доступны наборы записей регистров, а установка Отказ отменяет проведение и откатывает транзакцию.

Итог

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

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