Все статьи

9 октября 2026 г.

Граф вызовов экспортных процедур 1С: как архитектору увидеть всю конфигурацию за минуты

Почему архитектору 1С нужен граф вызовов, а не поиск по тексту

В конфигурациях уровня ERP, УТ 11, ЗУП КОРП или КА 2 содержится от 300 до 900 тысяч строк кода на BSL. Разбросаны они по общим модулям, модулям менеджеров, объектов, форм, команд и подписок. Когда архитектору нужно понять, кто вызывает экспортную процедуру ОбщегоНазначения.ЗаписатьДанныеВЖурналРегистрации или как устроена точка входа РаботаСЗаказами.СоздатьЗаказНаОсновании, обычный текстовый поиск превращается в бесконечный обход результатов Ctrl+Shift+F.

Проблема в том, что текстовый поиск не различает:

  • реальный вызов из кода и упоминание в комментарии или строке запроса;
  • вызов процедуры с тем же именем из другого общего модуля;
  • прямое обращение и вызов через Выполнить() или ОбщегоНазначения.ВыполнитьМетодКонфигурации();
  • переопределение экспортного метода в расширении (.cfe).

Для архитектора критично видеть именно граф вызовов экспортных процедур — направленный граф, где узлы это методы и модули, а рёбра — фактические вызовы с учётом области видимости, экспортности и контекста исполнения.

Что такое граф вызовов экспортных процедур 1С

Формально это ориентированный граф G = (V, E), где:

  • V — множество методов: экспортные процедуры и функции общих модулей, модулей менеджеров, модулей объектов, обработчиков подписок на события;
  • E — множество рёбер (u, v), если метод u содержит вызов v;
  • каждое ребро аннотировано контекстом: сервер/клиент, привилегированный режим, наличие в расширении, тип соединения.

Такой граф позволяет архитектору отвечать на вопросы, которые в обычной конфигурации требуют часов ручной работы:

  1. Какие экспортные методы общего модуля Продажи вызываются из клиентского контекста? (риск нарушения клиент-серверного разделения)
  2. Через какие цепочки ЗаказКлиента.ОбработкаЗаполнения доходит до записи в регистр?
  3. Какие экспортные процедуры вообще не вызываются — мёртвый код на сотни тысяч символов?
  4. Какие методы вызываются чаще всего — точки с максимальной связностью для рефакторинга?

Как построить граф вручную vs через Графон

Классический путь: выгрузить конфигурацию в XML через «Конфигуратор → Выгрузить в файлы», затем писать самописный парсер BSL. На практике это упирается в три стены:

  • парсер должен тянуть AST BSL, а не regex, иначе ловит вызовы в комментариях и строках запросов;
  • нужно учитывать Выполнить, Вычислить, отражения через ОбщегоНазначения.ВыполнитьМетодКонфигурации;
  • расширения (.cfe) многократно накладываются на базовую конфигурацию и переопределяют часть рёбер.

Графон (https://grafonbase.ru) решает это готовым MCP-сервером. Он индексирует всю конфигурацию локально (без выгрузки кода в облако), строит граф метаданных, вызовов, подписок и запросов и отдаёт ИИ-агенту или разработчику точный срез через MCP (Model Context Protocol).

Архитектура Графона

[Выгрузка 1С в XML] ---> [Индексатор Графона] ---> [Локальный граф: метаданные + вызовы + подписки + запросы]
                                                             |
                                                             v
                     [MCP-сервер] <--- JSON-RPC ---> [Claude Code / Cursor / Windsurf / Roo Code]

Индексатор парсит модули в AST, строит таблицу символов с учётом области видимости (Экспорт, &НаСервере, &НаКлиенте), разрешает вызовы через объектную модель платформы и сохраняет результат в локальный граф. Никакой синхронизации с внешними сервисами — всё работает на машине архитектора.

Практика: анализ экспортных процедур подсистемы «Продажи»

Допустим, у нас есть экспортный метод в общем модуле:

// ОбщийМодуль.Продажи.СоздатьРеализациюТоваровИУслуг
//
// Формирует документ на основании заказа. Используется подсистемами
// Закупки, Склад, Взаиморасчеты.
//
Функция СоздатьРеализациюНаОсновании(ЗаказКлиента, ЭтоЗаказПоставщику = Ложь) Экспорт
	
	Если НЕ ЗначениеЗаполнено(ЗаказКлиента) Тогда
		ВызватьИсключение НСтр("ru = 'Не передан заказ-основание'");
	КонецЕсли;
	
	Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
	ЗаполнитьШапку(Документ, ЗаказКлиента);
	Документ.Записать(РежимЗаписиДокумента.Проведение);
	
	ОбработкаСобытий.СозданиеЗаказаНаОсновании(Документ, ЗаказКлиента);
	
	Возврат Документ;
	
КонецФункции

Через Графон агент отправляет MCP-запрос:

{
  "jsonrpc": "2.0",
  "method": "graph.callers",
  "params": {
    "module": "ОбщийМодуль.Продажи",
    "method": "СоздатьРеализациюНаОсновании",
    "depth": 3,
    "includeExtensions": true
  }
}

И получает не весь общий модуль (12 000 строк), а только сигнатуры вызывающих методов из базовой конфигурации и всех активных расширений:

{
  "callers": [
    {"context": "Документ.РеализацияТоваровУслуг.МодульОбъекта.ОбработкаЗаполнения", "line": 214},
    {"context": "ОбщийМодуль.УправлениеПродажами.СоздатьРеализациюИзЗаказа", "line": 88},
    {"context": "Обработка.СозданиеСвязанныхДокументов.МодульОбъекта", "line": 430}
  ],
  "callees": [
    "ОбщийМодуль.Продажи.ЗаполнитьШапку",
    "Документы.РеализацияТоваровУслуг.СоздатьДокумент",
    "ОбщийМодуль.ОбработкаСобытий.СозданиеЗаказаНаОсновании"
  ]
}

Именно эти срез-данные и экономят контекстное окно ИИ-агента. Вместо загрузки 200 МБ XML конфигурации агент видит 30 строк JSON, релевантных задаче.

Сравнение: без Графона и с Графоном

| Сценарий | Без Графона (raw XML + LLM) | С Графоном (MCP) |
|---|---|---|
| Токенов на запрос «кто вызывает метод X» | 120 000 – 400 000 | 1 500 – 4 000 |
| Время ответа агента | 40 – 90 с | 2 – 5 с |
| Ложные связи из комментариев/строк | до 30 % | 0 % (AST) |
| Учёт расширений .cfe | вручную | автоматически |
| Галлюцинации по несуществующим методам | регулярно | отсутствуют |
| Стоимость 1 запроса (Sonnet 4.5) | ~$1.20 – $4.00 | ~$0.02 – $0.05 |

На конфигурации ERP 2.5 с 620 000 строк BSL разница по токенам достигает 10x, а по времени — 20x. Это и есть ключевая экономика: архитектор проводит не 3–4 сессии ревью в день, а 30+.

Сценарии, где граф вызовов незаменим

1. Оценка влияния изменений (impact analysis)

Перед рефакторингом РаботаСКурсамиВалют.ПересчитатьСумму архитектор запрашивает у Графона транзитивное замыкание исходящих вызовов на глубину 5 уровней. Получает список из 47 методов, 12 модулей и 6 подписок, которые прямо или косвенно затронуты.

2. Аудит клиент-серверного взаимодействия

Проверка: какой экспортный метод общего модуля вызывается без &НаСервере из клиентского контекста. Граф помечает такие рёбра специальным тегом context: client, и отклонения от архитектурных правил видны сразу.

3. Поиск мёртвого кода

Экспортные процедуры без входящих рёбер (кроме точек входа: подписок, HTTP-сервисов, операций обмена) — кандидаты на вынос в расширение или удаление. В типовой ERP такой анализ даёт 5–15 % избыточного кода.

4. Работа ИИ-агента в Claude Code

Когда Claude Code через MCP-сервер Графона получает задачу «добавить контроль остатков в создание реализации», агент делает три точных MCP-запроса и правит ровно те файлы, которые нужно. Ни переполнения контекста, ни галлюцинаций про несуществующие методы ОбщегоНазначения.ПроверитьОстатки.

Как начать

  1. Установить Графон локально и указать путь к выгрузке XML конфигурации.
  2. Дождаться индексации (для ERP 2.5 — около 4–8 минут на NVMe).
  3. Подключить MCP-сервер к Claude Code, Cursor, Windsurf или Roo Code.
  4. Открыть граф вызовов экспортных процедур через встроенный визуализатор или запросить срез у агента.

Документация и установка: https://grafonbase.ru

Граф вызовов экспортных процедур 1С — это не «красивая картинка» для презентации. Это рабочий инструмент архитектора, который одновременно ускоряет ревью, снижает расход токенов ИИ-агентов в 10 раз и делает рефакторинг больших конфигураций предсказуемым.