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

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

Обработчик события 1С: где находится и как его создать

Где искать обработчики событий в 1С: палитра свойств, модуль формы, подписки на события, общие модули. Пошаговое создание обработчика и типичные ошибки.

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

Запрос «обработчик события 1с где» обычно означает одну из трёх задач: найти существующий обработчик, который выполняет нежелательный код; понять, куда платформа поместит новый обработчик при его создании; или разобраться, почему написанный обработчик не вызывается. Все три ситуации решаются, если знать карту расположения обработчиков в конфигураторе.

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

Где находятся обработчики событий формы

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

Быстрый способ попасть в конкретный обработчик — палитра свойств. Выделите форму или элемент формы, откройте палитру свойств (правый клик → «Свойства» или Alt+Enter) и прокрутите список до раздела «События». Напротив имени события с заполненным обработчиком будет указано имя процедуры; кнопка с лупой у поля открывает код этого обработчика в модуле.

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

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

Где находятся обработчики событий объектов

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

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

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

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

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

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

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

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

Самый простой способ — через палитру свойств. Выделите форму или элемент, найдите нужное событие в разделе «События» и нажмите кнопку с лупой (или символ лупы в поле). Платформа автоматически создаст в модуле формы шаблон процедуры с правильным именем и параметрами и откроет его — останется написать тело обработчика.

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

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

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

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

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

Вторая причина — неверный контекст директив компиляции. Процедура с директивой &НаКлиенте не вызовется в серверном событии, и наоборот. Для событий формы директива должна соответствовать событию (ПриСозданииНаСервере — &НаСервере, ПриОткрытии — &НаКлиенте). Третья причина — обработчик написан в модуле объекта, а событие ожидалось в форме, или наоборот.

Типичные ошибки
01
Переименование процедуры в модуле без обновления имени в палитре свойств — событие перестаёт вызываться
02
Директива &НаКлиенте у серверного события — ошибка компиляции или молчаливый пропуск вызова
03
Код проверки данных размещён в форме вместо модуля объекта — при программной записи проверка не срабатывает
04
В подписке не указан источник или выбран не тот тип события — обработчик не вызывается ни для одного объекта
05
Правка типовой конфигурации вместо расширения — обработчик теряется при обновлении
Контрольные точки

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

Связь события и процедуры
Норма

В палитре свойств у события указано имя существующей процедуры; лупа открывает её код

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

Поле пустое или лупа создаёт новую пустую процедуру

Вызов обработчика
Норма

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

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

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

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

Директива (&НаКлиенте/&НаСервере) соответствует типу события

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

Ошибка «Процедура или функция с указанным именем не определена»

Обработчики в расширениях конфигурации

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

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

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

Модуль формы

Логика интерфейса: заполнение полей при открытии, реакция на ввод. Не работает при программной записи

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

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

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

Единая реакция на события многих объектов: нумерация, аудит, синхронизация

Расширение

Доработка типовой конфигурации без снятия с поддержки; ограничения по доступу к некоторым объектам

Отладка обработчиков событий

Для проверки работы обработчика используйте отладчик конфигуратора: поставьте точку останова в первой строке процедуры и запустите отладку (F5). При наступлении события выполнение остановится, и можно пошагово пройти код, проверяя значения переменных через табло (Shift+F9).

Если точка останова не срабатывает, последовательно проверьте: связано ли событие с процедурой в палитре свойств; правильный ли модуль открыт (форма/объект); не переопределён ли обработчик расширением; не отключена ли подписка. Для серверных вызовов убедитесь, что в настройках отладки включён нужный тип отладки (клиент/сервер).

Итог

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

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

Частые вопросы

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

Откройте модуль объекта или формы и используйте выпадающий список процедур и функций в верхней части окна модуля (или Ctrl+O) — он покажет все процедуры. Обработчики событий формы дополнительно видны в палитре свойств в разделе «События» у формы и каждого элемента.

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

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

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

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

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

Порядок событий жёстко задан платформой (например, ПередЗаписью всегда раньше ПриЗаписи) и не настраивается. Внутри одного события при нескольких подписках порядок их вызова не гарантирован — не стройте логику на последовательности подписок.

Что делать, если после обновления конфигурации обработчик пропал?

Если код был вписан напрямую в типовой модуль, при обновлении он мог быть замещён типовой версией. Восстановите код из копии и перенесите доработку в расширение конфигурации с аннотациями &После, &Перед или &Вместо — тогда изменения переживут обновления.

Где искать обработчик, если документ ведёт себя странно, а в его модулях пусто?

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