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