Разработка и Конфигурация · 9 мин
Как узнать, откуда вызывается процедура в 1С
Как найти, откуда вызывается процедура в 1С: поиск ссылок в конфигураторе, отладчик, замеры производительности, журнал регистрации. Пошаговые инструкции и частые ошибки.
При доработке конфигурации рано или поздно возникает задача: понять, откуда вызывается конкретная процедура или функция — какие модули, события и сценарии приводят к её выполнению. Это нужно при рефакторинге, при поиске причины лишнего вызова (например, процедура срабатывает дважды и дублирует движения) и перед удалением «ненужного» кода, чтобы не сломать неочевидные места.
В 1С нет единой кнопки «показать все вызовы», но есть несколько рабочих способов: штатный поиск ссылок в конфигураторе, полнотекстовый поиск по модулям, отладчик со стеком вызовов, замеры производительности и журнал регистрации. Ниже разобраны все варианты с условиями, когда какой подходит, и типичными ошибками.
Поиск ссылок на процедуру в конфигураторе
Основной инструмент — штатный поиск использования. Поставьте курсор на имя процедуры в её объявлении, нажмите правую кнопку мыши и выберите «Найти использование» (в ряде версий — через меню «Правка» или сочетание клавиш, зависящее от версии платформы). Конфигуратор просканирует модули и покажет список строк, где встречается это имя.
Альтернатива — глобальный поиск (Ctrl+Shift+F). Введите имя процедуры, ограничьте область поиска «Вся конфигурация» и включите поиск целых слов, чтобы отсечь совпадения, где имя является частью другого идентификатора (например, «Провести» и «ПровестиДокумент»). Результат выводится в окне сообщений или отдельной панели с возможностью перехода к каждой строке двойным щелчком.
Учтите важное ограничение: простой текстовый поиск находит только явные упоминания имени. Он не покажет вызовы через «Выполнить» или «Вычислить», где имя процедуры собрано строкой, и обработчики, подключённые динамически. О таких случаях — в отдельном разделе ниже.
- 1Откройте модуль с процедурой и выделите её имя
- 2Выполните «Найти использование» или глобальный поиск Ctrl+Shift+F по всей конфигурации
- 3Включите поиск целых слов, чтобы отфильтровать ложные совпадения
- 4Пройдите по каждой найденной строке и проверьте, действительно ли это вызов, а не комментарий или одноимённая переменная
- 5Для неявных вызовов дополнительно ищите имя как строковый литерал в кавычках
Отладчик и стек вызовов: откуда процедура вызвана в конкретном запуске
Когда нужно понять не «где вообще вызывается», а «кто вызвал её именно сейчас», поиск по тексту не поможет — нужен отладчик. Включите отладку в конфигураторе (меню «Отладка» → «Начать отладку» или подключение к уже запущенному сеансу через «Подключение»), поставьте точку останова на первой строке процедуры и воспроизведите ситуацию в пользовательском режиме.
Когда выполнение остановится, откройте окно «Стек вызовов» (меню «Отладка» → «Стек вызовов»). В нём видна цепочка: какая процедура вызвала текущую, какая — ту, и так до точки входа (обработчика события формы, команды, регламентного задания). Двойной щелчок по строке стека переводит в соответствующий модуль на строку вызова — так можно пройти весь путь и понять логику.
Этот способ незаменим, когда процедура вызывается из множества мест и нужно отловить именно «плохой» сценарий: например, двойное проведение или вызов при записи, который должен срабатывать только при проведении. Поставьте точку останова, повторите действие пользователя и по стеку увидите реальный источник.
Неявные и динамические вызовы, которые не находит поиск
Частая причина «процедура нигде не вызывается, но выполняется» — динамические вызовы. В 1С имя метода можно собрать строкой и выполнить через конструкции «Выполнить» и «Вычислить», а обработчики ожидания и оповещения подключаются через «ПодключитьОбработчикОжидания» и «ПодключитьОбработчикОповещения», где имя передаётся строковым литералом.
Поэтому после поиска по идентификатору обязательно выполните второй проход: ищите имя процедуры как строку в кавычках — "ИмяПроцедуры". Так вы найдёте подключённые обработчики и вызовы через «Выполнить». Дополнительно проверьте подписки на события: если процедура является обработчиком подписки (например, «ПриЗаписи»), её вызов инициирует платформа, а в дереве конфигурации её видно в узле «Общие» → «Подписки на события».
Отдельный случай — переопределяемые процедуры в библиотечных модулях (БСП и аналоги). Типовой код вызывает методы из модулей «Переопределяемый», и связь видна только если знать соглашение об именовании. Если процедура находится в таком модуле, ищите вызовы в общих модулях библиотеки по имени без префикса области.
Замеры производительности и журнал регистрации
Если задача — понять, как часто и откуда процедура вызывается в работающей системе без остановки пользователей, помогает замер производительности (меню «Отладка» → «Замер производительности»). В отчёте по замеру видны все выполненные строки кода с количеством вызовов и длительностью; по строке вызова процедуры видно модуль и место, откуда она запускалась.
Для длительного наблюдения используют журнал регистрации: в начало процедуры временно добавляют запись события через «ЗаписьЖурналаРегистрации» с указанием текущего стека или контекста (например, имени текущего пользователя и представления данных). Позже журнал фильтруется по этому событию, и становится видно, в каких сценариях процедура срабатывала.
Проверка результата: убедиться, что найдены все вызовы
Надёжный признак полноты поиска — комбинация методов. Сначала поиск по идентификатору и строковому литералу, затем проверка подписок на события и обработчиков ожидания, затем — при необходимости — контрольный прогон с точкой останова по основным сценариям работы. Если точка останова сработала из места, которого не было в результатах поиска, значит, есть динамический вызов, и нужно искать, где формируется строка с именем.
Перед удалением или переименованием процедуры полезно выполнить синтаксическую проверку модулей и тестовое проведение ключевых документов на копии. Ошибки вида «Процедура или функция с указанным именем не определена» при компиляции модуля покажут пропущенные статические вызовы, но динамические проявятся только в рантайме — поэтому тестирование сценариев обязательно.
Как проверить результат
Найдены все явные вызовы, каждый просмотрен глазами
В результатах комментарии и одноимённые переменные приняты за вызовы
Найдены обработчики ожидания и вызовы через «Выполнить»
Поиск не выполнялся — динамические вызовы пропущены
Процедура проверена на роль обработчика подписки
Процедура «нигде не вызывается», но срабатывает при записи объектов
Стек вызовов показывает ожидаемые источники
Точка останова срабатывает из неизвестного места — есть скрытый вызов
Часто задаваемые вопросы
Как найти вызовы процедуры во внешних обработках и расширениях?
Поиск конфигуратора работает только по открытой конфигурации. Для расширений откройте расширение в конфигураторе и выполните поиск в нём отдельно. Для внешних обработок (.epf) откройте файл в конфигураторе и ищите по его модулям; централизованного поиска по всем внешним файлам нет, поэтому обычно хранят обработки в общем каталоге и ищут по нему текстовым поиском по файлам.
Почему поиск показывает, что процедура нигде не вызывается, но она выполняется?
Наиболее вероятные причины: процедура является обработчиком подписки на событие, подключена через «ПодключитьОбработчикОжидания» или вызывается через «Выполнить»/«Вычислить» со строковым именем. Также проверьте, не вызывается ли она из расширения конфигурации — поиск основной конфигурации его не охватывает.
Как узнать, откуда процедура вызывается дважды?
Поставьте точку останова в начале процедуры и воспроизведите действие. При первой остановке запишите стек вызовов, продолжите выполнение (F5) и при второй остановке сравните стек. Различие покажет, какие два сценария приводят к вызову — часто это сочетание обработчика события формы и подписки на событие записи.
Можно ли найти вызовы без конфигуратора?
Да. Конфигурацию можно выгрузить в файлы (формат выгрузки конфигуратора или EDT-формат) и искать по текстовым файлам модулей любым редактором с поиском по каталогу. Это удобно для массового анализа и регулярных выражений, но требует актуальной выгрузки.
Что делать, если процедура вызывается из фонового задания и отладчик её не ловит?
В настройках отладки включите «Отладка фоновых заданий» (автоматическое подключение фоновых заданий к предметам отладки). После этого точка останова в коде, выполняемом фоновым заданием, будет срабатывать, и стек вызовов покажет путь от обработчика задания до процедуры.
Что важно запомнить
Начинайте с поиска использования в конфигураторе, обязательно дополняйте его поиском по строковому литералу и проверкой подписок на события. Для анализа конкретного запуска используйте отладчик и стек вызовов. Перед удалением процедуры проверяйте динамические вызовы и тестируйте на копии базы.