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

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

Что такое обработчик в 1С и как с ним работать

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

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

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

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

Что такое обработчик события и как он работает

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

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

Многие обработчики управляют дальнейшим поведением системы через параметры. Если в ПередЗаписью установить Отказ = Истина, запись будет прервана. Если в обработчике ОбработкаПроверкиЗаполнения добавить сообщение и установить отказ, пользователь не сможет провести документ, пока не исправит данные. Это основной механизм контроля корректности данных.

Основные виды обработчиков в 1С

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

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

Где размещать код

Модуль формы

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

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

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

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

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

Обработчики формы: сценарии и порядок вызова

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

Обработчик ПриИзменении поля

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

&НаКлиенте

Процедура ТоварыКоличествоПриИзменении(Элемент)

Строка = Элементы.Товары.ТекущиеДанные;

Строка.Сумма = Строка.Количество * Строка.Цена;

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

Директивы компиляции

Каждый обработчик формы помечается директивой: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. От этого зависит, где выполнится код и какие данные ему доступны. Частая ошибка — попытка обратиться к серверным данным из клиентского обработчика без вызова серверной процедуры: платформа выдаст ошибку компиляции или выполнения.

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

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

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

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

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

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

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

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

Большинство проблем с обработчиками связано с непониманием контекста выполнения и порядка вызова. Ниже — ошибки, которые встречаются чаще всего.

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

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

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

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

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

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

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

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

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

Отладчик не заходит в процедуру — событие не привязано или подписка не обновлена в базе

Контроль через Отказ
Норма

При нарушении условия запись блокируется и выводится понятное сообщение

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

Сообщение есть, но документ всё равно записывается

Работа при программной записи
Норма

Логика выполняется и из формы, и из обмена/фонового задания

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

Правило срабатывает только при интерактивной записи — код ошибочно размещён в форме

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

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

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

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

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

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

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

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

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

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

Что делать, если обработчик замедляет работу формы?

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

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

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

Итог

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

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