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