Как определить, к какой подписке на событие относится процедура-обработчик в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки и доработки конфигураций 1С (особенно крупных решений, таких как ERP, КА или УТ) программисты часто сталкиваются с необходимостью найти подписку на событие (ПодпискаНаСобытие), которая вызывает конкретную процедуру из общего модуля. Например, вы обнаружили процедуру ОбменДаннымиюпиОбменДОEPMПередЗаписью в общем модуле ОбменДаннымиСобытияУТУП и хотите понять, какое именно событие и для каких объектов её вызывает, чтобы создать аналогичный механизм для своего плана обмена.

Иногда обычный глобальный поиск по свойствам в Конфигураторе не дает результатов. В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько надежных способов быстро найти нужную подписку на событие.

Метод 1. Программный поиск через обход метаданных (Самый надежный способ)

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

Рассмотрим базовый пример кода, который перебирает все подписки на события в конфигурации и сравнивает имя их обработчика с искомой строкой:


Для каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
    Если Подписка.Обработчик = "ОбменДаннымиСобытияУТУП.ОбменДаннымиюпиОбменДОEPMПередЗаписью" Тогда
        Сообщить("Найдена подписка: " + Подписка.Имя);
    КонецЕсли;    
КонецЦикла;

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


ИскомыйОбработчик = ВРег("ОбменДаннымиюпиОбменДОEPMПередЗаписью");
Для каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
    ИмяОбработчика = ВРег(Подписка.Обработчик);
    Если Найти(ИмяОбработчика, ИскомыйОбработчик) > 0 Тогда
        Сообщить("Найдена подписка: " + Подписка.Имя + " | Полный путь обработчика: " + Подписка.Обработчик);
    КонецЕсли;    
КонецЦикла;

Этот скрипт найдет нужную подписку, даже если вы укажете имя процедуры не полностью или ошибетесь в названии общего модуля.

Метод 2. Поиск ссылок на общий модуль в Конфигураторе

Вместо долгого текстового поиска по свойствам конкретной процедуры гораздо быстрее использовать платформенный механизм поиска ссылок на объекты метаданных. Разберем этот процесс по шагам:

  1. Откроем дерево метаданных в Конфигураторе и перейдем в ветку Общие -> Общие модули.
  2. Найдем общий модуль, в котором расположена наша процедура (в нашем примере это ОбменДаннымиСобытияУТУП).
  3. Нажмем на него правой кнопкой мыши и выберем пункт меню «Поиск ссылок на объект».
  4. Платформа быстро проанализирует конфигурацию и выдаст список всех подписок на события, которые используют данный общий модуль.
  5. В полученном списке подписок останется лишь визуально определить ту, которая вызывает нашу процедуру (обычно их немного).

Метод 3. Правильная настройка глобального поиска по свойствам

Выясним причину, почему стандартный поиск по свойствам (нажатие комбинации клавиш Ctrl + Shift + F) часто «молчит» и ничего не находит. Дело в том, что в свойствах подписки обработчик записывается в формате ИмяОбщегоМодуля.ИмяПроцедуры. Если искать только окончание (имя процедуры), поиск может пропустить его.

Чтобы выполнить поиск корректно, настроим параметры глобального поиска следующим образом:

  1. В окне поиска в поле «Что искать» введем полное имя обработчика (например, ОбменДаннымиСобытияУТУП.ОбменДаннымиюпиОбменДОEPMПередЗаписью) либо только имя общего модуля.
  2. В разделе «Где искать» снимем все флажки, кроме флажка «Свойства».
  3. В области поиска обязательно укажем «Конфигурация» (или «Активная конфигурация»).
  4. Нажмем кнопку «Искать» и дождемся результатов.

Метод 4. Отладка и анализ стека вызовов

Если конфигурация запущена в режиме отладки и у нас есть возможность воспроизвести запись объекта, для которого должна сработать подписка, мы можем использовать стек вызовов:

  1. Откроем модуль общего модуля, найдем интересующую нас процедуру ОбменДаннымиюпиОбменДОEPMПередЗаписью и установим точку останова (клавиша F9) на первой строке кода.
  2. Запустим сеанс «1С:Предприятие» в режиме отладки и выполним действие, приводящее к записи нужного объекта (например, запишем элемент справочника или документ).
  3. После того как сработает точка останова, откроем окно «Стек вызовов» (меню Отладка -> Стек вызовов или сочетание клавиш Ctrl + Alt + C).
  4. В появившемся списке мы увидим всю цепочку вызовов. Строка, находящаяся непосредственно под вызовом нашей процедуры, укажет на конкретную подписку на событие, которая инициировала этот вызов.

Метод 5. Использование сторонних инструментов разработчика

Если вы работаете в современной среде разработки 1C:Enterprise Development Tools (EDT), поиск упрощается до одного клика:

Для классического Конфигуратора отличным подспорьем станут внешние обработки:

← На главную