В процессе разработки и доработки конфигураций 1С (особенно крупных решений, таких как ERP, КА или УТ) программисты часто сталкиваются с необходимостью найти подписку на событие (ПодпискаНаСобытие), которая вызывает конкретную процедуру из общего модуля. Например, вы обнаружили процедуру ОбменДаннымиюпиОбменДОEPMПередЗаписью в общем модуле ОбменДаннымиСобытияУТУП и хотите понять, какое именно событие и для каких объектов её вызывает, чтобы создать аналогичный механизм для своего плана обмена.
Иногда обычный глобальный поиск по свойствам в Конфигураторе не дает результатов. В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько надежных способов быстро найти нужную подписку на событие.
Если конфигурация огромная, а стандартный поиск в Конфигураторе зависает или не находит соответствий из-за особенностей индексации, проще всего написать небольшой скрипт. Мы можем запустить его в режиме «1С:Предприятие» через внешнюю обработку, консоль кода или групповую обработку объектов.
Рассмотрим базовый пример кода, который перебирает все подписки на события в конфигурации и сравнивает имя их обработчика с искомой строкой:
Для каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
Если Подписка.Обработчик = "ОбменДаннымиСобытияУТУП.ОбменДаннымиюпиОбменДОEPMПередЗаписью" Тогда
Сообщить("Найдена подписка: " + Подписка.Имя);
КонецЕсли;
КонецЦикла;
Проанализируем этот код. Он отлично работает, если имя обработчика указано абсолютно точно. Однако на практике разработчик может ошибиться в регистре букв или раскладке клавиатуры. Чтобы сделать поиск гарантированным, улучшим алгоритм, приведя строки к верхнему регистру и используя поиск подстроки:
ИскомыйОбработчик = ВРег("ОбменДаннымиюпиОбменДОEPMПередЗаписью");
Для каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
ИмяОбработчика = ВРег(Подписка.Обработчик);
Если Найти(ИмяОбработчика, ИскомыйОбработчик) > 0 Тогда
Сообщить("Найдена подписка: " + Подписка.Имя + " | Полный путь обработчика: " + Подписка.Обработчик);
КонецЕсли;
КонецЦикла;
Этот скрипт найдет нужную подписку, даже если вы укажете имя процедуры не полностью или ошибетесь в названии общего модуля.
Вместо долгого текстового поиска по свойствам конкретной процедуры гораздо быстрее использовать платформенный механизм поиска ссылок на объекты метаданных. Разберем этот процесс по шагам:
ОбменДаннымиСобытияУТУП).Выясним причину, почему стандартный поиск по свойствам (нажатие комбинации клавиш Ctrl + Shift + F) часто «молчит» и ничего не находит. Дело в том, что в свойствах подписки обработчик записывается в формате ИмяОбщегоМодуля.ИмяПроцедуры. Если искать только окончание (имя процедуры), поиск может пропустить его.
Чтобы выполнить поиск корректно, настроим параметры глобального поиска следующим образом:
ОбменДаннымиСобытияУТУП.ОбменДаннымиюпиОбменДОEPMПередЗаписью) либо только имя общего модуля.Если конфигурация запущена в режиме отладки и у нас есть возможность воспроизвести запись объекта, для которого должна сработать подписка, мы можем использовать стек вызовов:
ОбменДаннымиюпиОбменДОEPMПередЗаписью и установим точку останова (клавиша F9) на первой строке кода.Ctrl + Alt + C).Если вы работаете в современной среде разработки 1C:Enterprise Development Tools (EDT), поиск упрощается до одного клика:
Ctrl + Shift + G (команда «Find References»), и EDT мгновенно покажет дерево всех подписок, использующих данный метод.Для классического Конфигуратора отличным подспорьем станут внешние обработки: