Все статьи

16 сентября 2026 г.

Поиск связей общих модулей и подписок на события 1С для ИИ: MCP-сервер Графон вместо гигабайтов контекста

Почему ИИ-агент «слепнет» на большой конфигурации 1С

Выгрузка ERP или ЗУП в XML — это 3–8 ГБ файлов, из которых 400–900 МБ приходится на модули BSL. Один общий модуль уровня ЦенообразованиеСервер, УправлениеЗапасами или ОбщегоНазначения — это 5 000–25 000 строк. Когда Claude Code, Cursor или Windsurf открывает такой файл целиком, он сжигает 40–80 тысяч токенов на один модуль и всё равно не видит главного: как этот модуль связан с остальной конфигурацией.

Особенно болезненны два типа связей:

  1. Вызовы общих модулей. Метод РассчитатьЦену() живёт в одном модуле, вызывается из семи документов и трёх обработок, а его поведение зависит от проведения подчинённого документа.
  2. Подписки на события. Обработчик лежит в общем модуле, а связь с объектом объявлена в XML-метаданных подписки. Grep по ПриЗаписи не находит ничего — в модуле объекта этого кода просто нет.

Именно здесь ИИ-агенты начинают галлюцинировать: придумывают несуществующие методы, «забывают» обработчик подписки, ломают логику при рефакторинге.

Два типа связей, которые теряются чаще всего

Связь №1: вызовы общих модулей

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

Цена = ПолучитьПоследнююЦену(Номенклатура, ДатаЦены);
Скидка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "МаксимальнаяСкидка");

Возврат ?(Цена = Неопределено, 0, Цена * (1 - Скидка / 100));
КонецПроцедуры

Чтобы понять эту функцию, агенту нужны ПолучитьПоследнююЦену (локальный вызов), ОбщегоНазначения.ЗначениеРеквизитаОбъекта (внешний модуль), тип реквизита МаксимальнаяСкидка из метаданных справочника. Без графа агент читает три-четыре файла наугад.

Связь №2: подписки на события

// Общий модуль НаСобытияРеализации (Сервер, ВызовСервера)
// Подписка: Источник = Документ.РеализацияТоваровУслуг, Событие = ПриЗаписи
Процедура КонтрольЦенПриЗаписи(Источник, Отказ) Экспорт
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

Для Каждого СтрокаТЧ Из Источник.Товары Цикл
ЦенаКонтрольная = ЦенообразованиеСервер.РассчитатьЦенуНоменклатуры(
СтрокаТЧ.Номенклатура, Источник.Дата);
Если СтрокаТЧ.Цена < ЦенаКонтрольная Тогда
Отказ = Истина;
Сообщить("Цена ниже минимальной: " + СтрокаТЧ.Номенклатура);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

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

Архитектура Графона: граф зависимостей конфигурации

Графон собирает граф в четыре слоя прямо на машине разработчика, без облака и без выгрузки кода наружу:

  1. Парсер метаданных — проходит XML-выгрузку, индексирует объекты, реквизиты, формы, подписки на события, регламентные задания.
  2. Парсер BSL — строит AST каждого модуля, вытягивает объявления процедур и функций, экспортные флаги, области, фактические вызовы.
  3. Построитель графа — соединяет узлы рёбрами вызывает, подписан_на, использует_реквизит, читает_таблицу, экспортирует.
  4. MCP-сервер — отдаёт агенту готовые срезы через Model Context Protocol.

| Узел графа | Входящие/исходящие рёбра |
|---|---|
| Общий модуль | экспортирует метод, вызывает модуль, читает метаданные |
| Метод (процедура/функция) | вызывает, вызывается_из, использует_реквизит |
| Подписка на событие | источник, событие, обработчик, режим |
| Объект метаданных | имеет_реквизит, имеет_форму, участвует_в_подписке |
| Запрос (текст) | читает_таблицу, читает_поле |

MCP-инструменты: что именно запрашивает агент

{
  "jsonrpc": "2.0",
  "id": 42,
  "method": "tools/call",
  "params": {
    "name": "find_event_subscriptions",
    "arguments": {
      "source": "Документ.РеализацияТоваровУслуг",
      "event": "ПриЗаписи",
      "with_handler_body": true,
      "trace_call_chain_depth": 2
    }
  }
}

Ответ — уже отфильтрованный срез: только обработчик, только вызываемые им методы до второго уровня, только использованные реквизиты. Не 200 000 токенов XML, а 4 000–8 000 токенов по делу.

Ключевые инструменты Графона:

  • find_module_links — все входящие и исходящие связи общего модуля;
  • find_event_subscriptions — подписки по источнику, событию или обработчику;
  • get_call_chain — граф вызовов от точки входа до листа;
  • get_context_slice — минимальный набор файлов и сигнатур для задачи;
  • impact_analysis — обратный анализ: кого сломает изменение метода;
  • find_query_usage — где читается конкретная таблица или реквизит.

Сценарий: «кто перезаписывает цены при проведении реализации»

Промпт агенту в Cursor или Claude Code:

Используй графон. Найди все подписки на событие ПриЗаписи для Документ.РеализацияТоваровУслуг, построй цепочку вызовов до 3 уровней и покажи, какие общие модули влияют на реквизит Товары.Цена.

Агент делает три MCP-вызова и получает: подписку КонтрольЦенПриЗаписи, цепочку ЦенообразованиеСервер.РассчитатьЦенуНоменклатуры → ПолучитьПоследнююЦену, список из шести модулей-участников и точные номера строк. Без Графона тот же результат достигается чтением 18–25 файлов и всё равно остаётся неполным.

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

| Задача | Токенов без Графона | Токенов с Графоном | Время без | Время с |
|---|---|---|---|---|
| Найти подписки на ПриЗаписи документа | ~180 000 | ~4 500 | 10–15 мин | 30–60 сек |
| Цепочка вызовов от подписки (3 уровня) | ~320 000 | ~9 000 | 20–30 мин | 1–2 мин |
| Анализ влияния правки метода | ~450 000 | ~12 000 | 30+ мин | 2 мин |
| Онбординг в чужой общий модуль | ~210 000 | ~6 000 | 15 мин | 45 сек |
| Поиск, где читается реквизит | ~150 000 | ~3 500 | 8–12 мин | 20 сек |

Экономия — до 10 раз по токенам и в 10–20 раз по времени. Главное: агент перестаёт выдумывать методы, потому что работает не с «похоже на то», а с реальными сигнатурами из графа.

Как встроить Графон в пайплайн команды

  1. Установите Графон локально и укажите путь к XML-выгрузке конфигурации.
  2. Запустите первичную индексацию — граф строится один раз, инкрементально обновляется по изменённым файлам.
  3. Пропишите MCP-сервер в конфигурацию Claude Code (.mcp.json), Cursor или Windsurf.
  4. Добавьте в правила проекта инструкцию: «перед анализом BSL всегда вызывай get_context_slice».
  5. Включите Графон в pre-commit хук: impact_analysis по изменённым методам покажет затронутые подписки и общие модули.
// Пример проверки в CI: регламентное задание контроля графа связей
Процедура ПроверитьЦелостностьГрафаСвязей() Экспорт
    Отчёт = Графон.ПроверитьСвязи(
        Новый Структура("ВключатьПодписки, Глубина", Истина, 3));

Для Каждого Проблема Из Отчёт.РазорванныеСвязи Цикл
ЗаписьЖурналаРегистрации("Графон.Связи",
УровеньЖурналаРегистрации.Предупреждение, , ,
Проблема.Описание);
КонецЦикла;
КонецПроцедуры

Ограничения, о которых стоит знать

  • Граф строится по статическому анализу: динамические вызовы через Вычислить() и Выполнить() в него не попадают — их нужно помечать вручную.
  • Подписки, добавленные расширениями конфигурации, индексируются отдельно, проверяйте режим заимствования.
  • Для очень больших КА и ERP первичная индексация занимает 10–25 минут, поэтому её лучше запускать ночью или на выделенной машине.
  • Контекстный срез бессмысленен без актуального графа: после крупного мержа обязательно делайте реиндексацию.

Чек-лист внедрения

  1. Индексация конфигурации и расширений в Графоне.
  2. Подключение MCP-сервера к вашему ИИ-агенту.
  3. Замер базовой стоимости задачи без графа для сравнения.
  4. Правила промптов: сначала find_event_subscriptions, потом get_call_chain, только потом чтение кода.
  5. Ревью ответов агента по графу перед коммитом.
  6. Регламентная реиндексация после обновления конфигурации.

Поиск связей общих модулей и подписок на события 1С для ИИ — это не про «скормить побольше кода модели», а про точный контекст. Графон отдаёт агенту ровно тот срез графа, который нужен для ответа, и это единственный способ работать с ERP, ЗУП и КА без десятикратного перерасхода токенов и без галлюцинаций.