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