Все статьи

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

Локальный граф метаданных 1С vs полная выгрузка в файлы: почему ИИ-агент тонет в XML и как это исправить

Почему полная выгрузка конфигурации 1С в файлы перестала работать

Классический сценарий: конфигурацию выгружают в XML через Конфигуратор → Выгрузить конфигурацию в файлы или 1С:Хранилище → Выгрузить в файлы, подключают папку к Cursor, Windsurf или Claude Code и ждут чуда. Чуда не происходит. Типовая ERP 2.5 в выгрузке — это 4–7 ГБ XML, 250 000+ файлов, десятки тысяч модулей BSL, десятки миллионов строк кода на встроенном языке.

ИИ-агент, которому дали такой репозиторий, сталкивается с тремя стенами:

  1. Переполнение контекстного окна. Даже 200K токенов не вмещают модуль ОбщегоНазначения, БухгалтерскийУчет и УправлениеСкладом одновременно. Агент выбирает случайные фрагменты и теряет связи.
  2. Перерасход токенов. Каждый запрос «найди, кто вызывает ПровестиДокумент» превращается в чтение сотни связанных модулей. Реальная стоимость сессии вырастает в 5–10 раз.
  3. Галлюцинации. Без графа вызовов агент путает методы менеджеров объектов с общими модулями, изобретает несуществующие процедуры, «вспоминает» сигнатуры из ERP 2.4 при работе с 2.5.

Полная выгрузка в файлы — это не структура знаний, это свалка исходников. Она годится для Git и диффов, но не для ИИ-агента.

Что такое локальный граф метаданных

Локальный граф метаданных — это индекс, построенный один раз по выгрузке 1С и хранящий не файлы, а связи между сущностями. Вершины графа:

  • объекты метаданных (Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, Обработка.ВыгрузкаТоваров);
  • модули (объект, менеджер, форма, общий модуль, HTTP-сервис);
  • процедуры и функции BSL с сигнатурами и параметрами;
  • подписки на события (ПередЗаписью, ПриПроведении, ПриСозданииНаСервере);
  • запросы и используемые в них таблицы;
  • роли, права, RLS-шаблоны;
  • вызовы сервер↔клиент (директивы &НаСервере, &НаСервереБезКонтекста, &НаКлиенте).

Ребра графа — это: ВЫЗЫВАЕТ, ВЫЗЫВАЕТСЯ_ИЗ, ПОДПИСАН_НА, ЧИТАЕТ_ТАБЛИЦУ, ПЕРЕОПРЕДЕЛЯЕТ, ВЫГРУЖАЕТ_В_ФОРМУ, ОБРАЩАЕТСЯ_К_HTTP.

Grafon — это локальный инструмент и MCP-сервер, который строит такой граф по выгрузке конфигурации 1С и отдаёт его ИИ-агенту через протокол Model Context Protocol. Агент больше не читает файлы — он делает точечные запросы к графу.

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

[Выгрузка 1С в файлы]
        │
        ▼
[Парсер XML метаданных + BSL AST]
        │
        ▼
[Индексатор: вершины + рёбра → локальное хранилище]
        │
        ▼
[MCP-сервер Grafon]  ──stdio/SSE──►  Claude Code / Cursor / Windsurf / Roo Code

Этапы:

  1. Индексация. Графон разбирает Configuration.xml, .md объектов, Ext/ObjectModule.bsl, Forms//Ext/Form/Module.bsl. Строит дерево метаданных и AST модулей.
  2. Разрешение связей. Сопоставляет вызовы ОбщегоНазначения.ЗначениеРеквизитаОбъекта() с реальными определениями, разворачивает подписки, определяет, какие формы дёргают какие экспортные функции.
  3. Хранение. Локальный индекс (SQLite + графовые adjacency-таблицы) на диске разработчика. Никакой телеметрии, никакой отправки кода на сервер.
  4. MCP-слой. Набор инструментов, которые агент вызывает как обычные функции.

MCP-инструменты Графона в работе

Реальные запросы, которые делает Claude Code или Cursor:

{
  "method": "tools/call",
  "params": {
    "name": "grafon.resolve_symbol",
    "arguments": {
      "query": "ОбщегоНазначения.ЗначениеРеквизитаОбъекта",
      "configuration": "ERP25"
    }
  }
}

Ответ — сигнатура, файл, строка, список вызывающих:

{
  "symbol": "ОбщегоНазначения.ЗначениеРеквизитаОбъекта",
  "signature": "(Ссылка, ИмяРеквизита, ТолькоПоСсылке = Ложь) Экспорт",
  "definedIn": "CommonModules/ОбщегоНазначения/Ext/Module.bsl:1487",
  "callers": 412,
  "modules": ["Документ.РеализацияТоваровУслуг", "Обработка.ЗакрытиеМесяца", "..."]
}

Ключевые инструменты MCP:

  • grafon.find_object — найти объект метаданных по имени или описанию.
  • grafon.slice — выдать точный срез: N вызывающих + саму процедуру, без остального модуля.
  • grafon.callers — все, кто вызывает функцию (включая через подписки).
  • grafon.subscriptions — какие подписки срабатывают на ПриПроведении документа.
  • grafon.query_tables — какие таблицы читает конкретный запрос.
  • grafon.diff_impact — что сломается, если поменять сигнатуру.

Пример сценария правки:

// Агент хочет изменить процедуру
// и запрашивает у Графона контекст
// grafon.slice(module="Документ.РеализацияТоваровУслуг.МодульОбъекта",
//              proc="ОбработкаПроведения",
//              depth=2)

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

Агент получает ровно этот фрагмент и соседние вызовы, а не весь 4 000-строчный модуль.

Сравнение: полная выгрузка vs Графон

| Метрика | Полная выгрузка в файлы | Локальный граф Графон |
|---|---|---|
| Размер структуры, попадающей в контекст | 4–7 ГБ, 250 000+ файлов | индексирован локально, в контекст идут килобайты |
| Токенов на типовую задачу «найти и поправить процедуру» | 180 000 – 340 000 | 12 000 – 22 000 |
| Время до первого ответа агента (ERP 2.5) | 6–15 мин (сканирование репо) | 4–20 сек (MCP-запрос) |
| Галлюцинации сигнатур | высокие | практически исключены (граф знает реальные определения) |
| Стоимость сессии Claude Sonnet | ×1 (базовая) | ×0.1 (в 10 раз меньше токенов) |
| Работа с подписками на события | ручной grep, ошибки | точный список подписок и их модулей |
| Кроссплатформенность | нужен Git + IDE | MCP работает в Claude Code, Cursor, Windsurf, Roo Code |
| Приватность | файлы остаются у вас | индекс строится локально, код не покидает машину |

Цифры по токенам и времени — усреднённые замеры на ERP 2.5.11 и УТ 11.4 с контекстом Claude Sonnet 200K.

Практические сценарии

1. Правка общих модулей

Задача: оптимизировать ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Без графа вы рискуете «сломать» 412 вызывающих. Графон показывает полный список и типы параметров вызовов — можно безопасно менять.

2. Анализ воздействия перед обновлением

Перед переходом на релиз ERP 2.5 → 2.6 агент запрашивает grafon.diff_impact и получает список процедур, где изменились сигнатуры.

3. Разбор подписок на события

Классическая боль — найти, кто на самом деле «прилетает» в ПередЗаписью документа. Графон отдаёт все подписки, порядок срабатывания и модули.

4. Генерация тестов

Имея граф, агент пишет модульные тесты (в стиле YAxUnit), опираясь на реальные сигнатуры и фикстуры данных.

5. Онбординг

Новый разработчик в команде задаёт вопрос «как проводится реализация?» через Claude Code + Графон и получает точный путь вызовов, а не 200 страниц документации.

Как запустить локальный граф

# 1. Выгрузить конфигурацию в файлы из Конфигуратора

2. Указать путь Графону

grafon index --src ./erp25_xml --name ERP25

3. Подключить MCP-сервер к Claude Code

claude mcp add grafon --command "grafon mcp --config ./erp25.grafon"

Дальше в Cursor / Windsurf / Roo Code прописывается тот же MCP-эндпоинт. Агент сам вызывает инструменты Графона, когда нужно «посмотреть контекст».

Итог

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