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

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

Обработчик события в 1С: что это и как создать

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

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

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

Ниже разберём, какие виды событий существуют в 1С, где именно размещаются обработчики, как создать обработчик через конфигуратор и вручную, и какие типичные ошибки допускают начинающие разработчики.

Какие виды событий существуют в 1С

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

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

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

Где размещаются обработчики событий

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

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

Место размещенияТипичные событияКогда выбирать
Модуль формыПриОткрытии, ПриИзменении, НажатиеРеакция на действия пользователя в интерфейсе
Модуль объектаПередЗаписью, ОбработкаПроведенияПроверки и расчёты, обязательные при любом способе записи
Общий модульОбработчики подписок на событияЕдиная логика для нескольких видов объектов
Модуль приложенияПриНачалеРаботыСистемыДействия при старте и завершении сеанса

Как создать обработчик события формы или кнопки

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

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

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

Пример простого обработчика кнопки:

&НаКлиенте

Процедура РассчитатьСуммуНажатие(Элемент)

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

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

Как создать обработчик события объекта

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

Ключевые события документа: ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) — срабатывает до записи, позволяет отменить её установкой Отказ = Истина; ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) — для собственных проверок; ОбработкаПроведения(Отказ, РежимПроведения) — формирование движений по регистрам.

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

Если Товары.Итог("Сумма") = 0 Тогда

Отказ = Истина;

Сообщить("Документ без суммы не может быть записан.");

КонецЕсли;

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

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

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

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

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

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

Подходит для логики, специфичной для одного вида объектов; код виден прямо в объекте, но изменения затрагивают типовой модуль

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

Подходит для сквозной логики по нескольким объектам и для доработок без изменения типового кода; сложнее отлаживать при большом числе подписок

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

В управляемых формах каждый обработчик имеет директиву компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Клиентские обработчики работают с интерфейсом, но не имеют прямого доступа к запросам и прикладным объектам; серверные — выполняют запросы и обращения к данным, но не видят элементы формы.

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

Проверка результата и типичные ошибки

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

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

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

Точка останова в теле обработчика
Норма

Выполнение останавливается при наступлении события

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

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

Свойство события в палитре свойств
Норма

В поле события указано имя процедуры

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

Поле пустое — обработчик существует, но не привязан

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

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

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

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

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

FAQ

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

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

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

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

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

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

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

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

Что такое директивы &НаКлиенте и &НаСервере и обязательны ли они?

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

Итог

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

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