Перейти к содержимому

Идёт открытая бета — все возможности бесплатныПодробнее

one-s-mcp

Граф вызовов с точностью до модуля

Содержание

Когда ассистент отвечает на вопрос «кто вызывает эту процедуру», важно не просто найти строчку с похожим именем — важно понять, о какой именно процедуре в каком именно модуле идёт речь. В типовых конфигурациях 1С процедур с одинаковыми именами — десятки, и разбросаны они по разным менеджерам объектов. one-s-mcp строит карту вызовов с точностью до конкретной процедуры и функции, а не по совпадению текста, — и делает это локально, на вашей машине.

Какую боль решает

Разработчик, который берётся дорабатывать чужой или типовой код, регулярно упирается в один и тот же вопрос: «откуда это вообще вызывается?» В простом сценарии — открыть «Поиск ссылок на объект» в конфигураторе и вручную пройти по списку. В сложном — искать текстом по всей конфигурации и разгребать десятки совпадений, из которых половина не имеет отношения к делу.

Вторая, более коварная проблема — одноимённые методы. В крупных типовых конфигурациях сплошь и рядом встречаются процедуры с одинаковым названием в разных модулях: своя ЗаполнитьПоУмолчанию() у справочника «Номенклатура», своя — у справочника «Контрагенты», своя — у документа «ЗаказПокупателя». Обычный текстовый поиск по имени метода не различает эти методы между собой — он находит все вхождения строки «ЗаполнитьПоУмолчанию» по всей конфигурации, не разбирая, к какому объекту какой вызов относится. В итоге либо ассистент, либо сам разработчик рискует сделать ложный вывод: «эта функция вызывается отсюда» — хотя на самом деле вызывается совсем другая функция с тем же именем из другого модуля. Чем крупнее типовая, тем больше таких «однофамильцев» и тем дороже обходится ошибка: доработка, сделанная по неверному следу, может задеть не тот участок кода.

Отдельная задача — расследование чужого кода в большой базе. Нужно понять не только «кто зовёт меня», но и «кого зову я» — то есть всю цепочку вызовов конкретной процедуры в обе стороны: обработчики форм, подключаемые команды, подписки на события, вызовы из других модулей. Руками это долгие часы чтения кода и переключения между процедурами по всей конфигурации, особенно если вы видите базу впервые и не знаете, где искать точку входа.

Как это работает

Ассистент видит не только список объектов конфигурации, но и карту их связей: кто кого вызывает, кто кому подчинён, какой документ пишет в какой регистр. Эта карта строится в отдельном модуле — сервере связей метаданных, — который берёт уже разобранную структуру конфигурации (её готовит сервер поиска по коду и метаданным) и складывает все связи в специальную графовую базу прямо на машине клиента. Повторно разбирать XML-выгрузку конфигурации не нужно — граф собирается из уже готовых данных.

Ключевая деталь — как именно строятся связи вызовов. При сборке графа создаётся индекс соответствия «модуль + имя процедуры → конкретная процедура». Вызовы вида РегистрыСведений.Имя.Метод(), Справочники.Имя.Метод(), Отчёты.Имя.Метод() и аналогичные им сопоставляются с менеджер-модулями объектов всех видов — не только справочников и документов, но и регистров, отчётов, обработок, бизнес-процессов и других. Связь между двумя процедурами фиксируется в графе, только если такая процедура действительно существует в этом конкретном модуле, — это отсекает случайные текстовые совпадения и снижает число ложных следов.

Именно поэтому граф различает «однофамильцев»: если в базе есть ЗаполнитьПоУмолчанию() и у справочника «Номенклатура», и у справочника «Контрагенты», ассистент видит это как два разных узла графа с разными связями, а не как одну размытую сущность. Спросите «кто вызывает эту процедуру у справочника Номенклатура» — и в ответе будут только реальные вызовы именно этого метода, без примеси однофамильцев из других модулей. То же самое касается менеджеров отчётов, обработок, бизнес-процессов — резолюция вызовов работает одинаково для всех видов объектов, а не только для справочников и документов.

В граф попадают не только вызовы процедур и функций, но и вся структура конфигурации целиком: объекты, формы, команды, подсистемы, подписки на события, связи документов с регистрами, владение подчинённых справочников, перехваты процедур типовой из расширений (&Перед/&После/&Вместо). Обход графа можно делать «от объекта» — что заденет правка справочника или документа целиком, — а можно «от процедуры»: вся цепочка вызовов от конкретной функции, включая обработчики форм, команды и перехваты расширений. Каждый шаг в ответе помечен происхождением связи и уровнем уверенности, так что видно не только сам факт связи, но и откуда она взялась — это не безликий список совпадений, а прослеживаемая цепочка.

На практике это выглядит как обычный вопрос ассистенту в диалоге: «кто вызывает функцию РассчитатьСкидку в модуле объекта документа ЗаказПокупателя» или «покажи всю цепочку вызовов от процедуры ОбработкаПроведения этого документа». Ассистент обходит граф и отвечает конкретными именами модулей и процедур — без «где-то в конфигурации есть похожая функция».

Собирается всё локально, во встроенной графовой базе. Структура вашей конфигурации не покидает машину — это особенно важно, если работа ведётся с базой под NDA. После каждой переиндексации структуры граф пересобирается заново без обращения к нейросети, а на крупных типовых конфигурациях (например, на полной «Бухгалтерии») сборка укладывается в минуты — связи загружаются массово, нативным способом, а не вставляются по одной.

Что это даёт

Тот же граф связей лежит в основе и другой возможности — оценки того, что сломается при изменении объекта или процедуры. Ассистент проходит по графу зависимостей от выбранной точки и возвращает цепочку затрагиваемых мест. Как это работает — подробно в блоге, а сама возможность описана отдельно: Анализ влияния изменений.

Честно об ограничениях

Сборка карты связей — видимая операция, а не невидимый фон: у неё свой прогресс, при закрытии окна приложение её дожидается, а не бросает на полпути. Если сборка всё-таки сорвалась, это видно в карточке базы, и рядом стоит кнопка «пересобрать». Устаревший граф помечается как устаревший, а на пустом — модуль честно отказывает, вместо того чтобы отвечать «связей нет». Разница здесь принципиальная: пустой ответ и «нечего показать» — не одно и то же, а вывод «на это никто не ссылается, можно менять» не должен оказаться ловушкой. Если роль, подписку или подсистему прочитать не удалось, это тоже называется прямо.

Граф вызовов не всесилен — у него есть один системный пробел. Если имя процедуры или объекта вычисляется динамически, в переменной, и вызывается через «Выполнить» или «Вычислить», такую связь граф установить не может в принципе: на этапе сборки графа неизвестно, какая именно строка окажется в переменной во время выполнения. Это редкий, но встречающийся в 1С паттерн, и его стоит держать в уме при расследовании.

Ещё один честный пробел: подписки на события и регламентные задания сами по себе в индексе есть и отвечают карточкой, но связь «подписка → процедура-обработчик» отдельным ребром графа вызовов пока не выражена. Это следующий шаг, а не сегодняшняя возможность.

Ещё важно понимать, о чём граф — а о чём нет. Он про структуру конфигурации: какие объекты, модули и процедуры существуют и как они связаны между собой. Он не про данные — какие записи лежат в справочниках и документах конкретной базы, граф не хранит и не показывает.

Источником для графа служит XML-выгрузка конфигурации — та же, которую приложение готовит при индексации. Граф не читает .cf-файл и не подключается напрямую к боевому кластеру.

Что дальше

Хотите увидеть, как ассистент отвечает на вопросы «кто вызывает» и «кого вызывает» по вашей собственной конфигурации, без единого ложного однофамильца? Скачайте one-s-mcp и подключите его к базе. Полный список того, что умеет ассистент, — на странице Все возможности.