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