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

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

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

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

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

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

Ниже разберём все типовые места размещения обработчиков, способы их быстрого поиска через конфигуратор и отладчик, а также типичные ошибки, из-за которых обработчик «не срабатывает», хотя код написан верно.

Где искать обработчики событий объектов: модуль объекта

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

Чтобы открыть модуль объекта, в конфигураторе найдите нужный объект в дереве конфигурации (например, «Документы → РеализацияТоваровУслуг»), нажмите правой кнопкой мыши и выберите «Открыть модуль объекта». Если обработчика с нужным именем в модуле нет, его можно добавить вручную — платформа подхватит процедуру по стандартному имени автоматически.

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

Обработчики событий формы: модуль формы и палитра свойств

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

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

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

Если обработчик назначен программно (через УстановитьДействие), в палитре свойств его не будет — такой код ищите поиском по модулю формы по слову «УстановитьДействие» или по имени события.

Подписки на события: обработчики в общих модулях

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

В свойствах подписки указываются: источник (типы объектов, например «ДокументОбъект.РеализацияТоваровУслуг»), событие (например, ПередЗаписью или ОбработкаПроведения) и обработчик — процедура вида ИмяМодуля.ИмяПроцедуры. Сама процедура принимает параметры события: источник, отказ и другие, в зависимости от типа события.

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

Модуль менеджера, модуль приложения и другие места

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

Модуль управляемого приложения (корень дерева конфигурации → правый клик → «Открыть модуль управляемого приложения») содержит обработчики событий сеанса: ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы, ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия и другие. В обычном приложении аналогичные события находятся в модуле обычного приложения.

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

Запись или проведение документаМодуль объекта

ПередЗаписью, ПриЗаписи, ОбработкаПроведения

Открытие формы, кнопки, поляМодуль формы

ПриОткрытии, ПриСозданииНаСервере, обработчики элементов

Одинаковая логика для многих объектовОбщий модуль + подписка

Ветка «Общие → Подписки на события»

Автоподбор и форма выбораМодуль менеджера

ОбработкаПолученияДанныхВыбора, ОбработкаПолученияФормы

Старт и завершение сеансаМодуль приложения

ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы

Как быстро найти обработчик: поиск и отладчик

Когда место размещения неизвестно, помогает глобальный поиск по конфигурации: меню «Правка → Глобальный поиск» (Ctrl+Shift+F) по имени процедуры или по имени события. Поиск по слову ПередЗаписью покажет все модули, где объявлен такой обработчик, включая общие модули подписок.

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

Для проверки того, какие именно обработчики вызвались, полезно временно добавить в код строку Сообщить("Сработал обработчик ...") или запись в журнал регистрации через ЗаписьЖурналаРегистрации. После диагностики отладочный вывод обязательно удалите, чтобы не засорять журнал и не замедлять работу пользователей.

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

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

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

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

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

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

Обработчик вызывается платформой
Норма

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

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

Отладчик не останавливается — проверяйте имя, место и флаги модуля

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

В свойствах подписки заполнены источник, событие и обработчик; общий модуль серверный

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

Пустое поле обработчика или клиентский общий модуль

Логика работает во всех сценариях
Норма

Код выполняется и при записи из формы, и при программной записи

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

Срабатывает только при ручной записи через форму

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

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

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

Итог

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

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

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

Как открыть модуль объекта документа в конфигураторе?

В дереве конфигурации найдите документ, нажмите по нему правой кнопкой мыши и выберите «Открыть модуль объекта». Альтернатива — выделить объект и нажать кнопку «Модули» на панели, если она доступна в вашей версии платформы.

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

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

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

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

Как узнать, какие подписки на события есть в конфигурации?

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

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

Да, для элементов формы используется метод УстановитьДействие, а для формы в целом обработчики можно назначать динамически в коде. Такие назначения не видны в палитре свойств, поэтому ищите их поиском по модулю формы.

Где искать обработчик, если код добавлен через расширение конфигурации?

Откройте список расширений (в конфигураторе: «Конфигурация → Расширения конфигурации»), затем откройте само расширение и ищите процедуры с аннотациями &Перед, &После, &Вместо над заимствованными обработчиками.