Все статьи

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

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

Почему обычный поиск по метаданным 1С ломает LLM-агента

Конфигурации 1С:ERP, УТ 11, ЗУП КОРП, КА 2 содержат десятки тысяч объектов метаданных и миллионы строк BSL. Когда вы подключаете к такой базе Claude Code, Cursor или Windsurf «в лоб» — через чтение XML-выгрузки и модулей с диска — агент сталкивается с двумя проблемами:

  1. Переполнение контекста. Файл Document.РеализацияТоваровУслуг.xml весит 300–800 КБ. Общий модуль УправлениеЗапасами — 4000+ строк. Даже 200k токенов не хватит, чтобы «увидеть» одну сквозную бизнес-операцию.
  2. Потеря неявных связей. Связь между документом и регистром сведений часто реализована не через метаданные, а через BSL:
  3. - динамические подписки на события;
  4. - обращения через РегистрыСведений.<Имя>.СоздатьМенеджерЗаписи();
  5. - вычисляемые измерения;
  6. - чтение через Запрос с параметром Период;
  7. - регистраторы, связанные с документом только в виртуальных таблицах.

Именно эти неявные связи LLM не видит, потому что они живут в коде, а не в XML.

Три уровня неявных связей в 1С

Прежде чем строить граф, формализуем задачу. Неявные связи между документами и регистрами сведений делятся на три уровня.

Уровень 1. Связи метаданных (видимые)

// Владелец измерения регистра сведений — документ
// РегистрСведений.ЦеныНоменклатуры: измерение Номенклатура,
// ресурс Цена, регистратор отсутствует (независимый)

Это видно в XML. LLM справится без графа, если дать ему только эти два объекта.

Уровень 2. Связи через код BSL (скрытые)

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

LLM, читающий только XML документа, эту связь не увидит. Нужно пройти по AST модуля объекта.

Уровень 3. Связи через запросы и виртуальные таблицы (динамические)

Запрос.Текст =
"ВЫБРАТЬ
|   Цены.Номенклатура,
|   Цены.Цена
|ИЗ
|   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Момент, Номенклатура = &Номенклатура) КАК Цены";

Здесь связь документа-источника и регистра существует только семантически, через &Момент. Уловить её можно только по графу «запрос → виртуальная таблица → регистр».

Что даёт MCP-сервер Графон: граф метаданных + BSL

Grafon (https://grafonbase.ru) индексирует конфигурацию локально и строит граф, где узлы — это:

  • объекты метаданных (Документ, РегистрСведений, Справочник, ОбщийМодуль, Форма);
  • процедуры и функции BSL;
  • подписки на события;
  • тексты запросов и их источники.

Рёбра графа фиксируют:

| Тип ребра | Пример | Как выявляется |
|---|---|---|
| WRITES_TO | Документ → РегистрСведений | AST вызова СоздатьНаборЗаписей / Записать |
| READS_FROM | Общий модуль → РегистрСведений | Вызов .Получить() / .СрезПоследних() |
| QUERIES | Процедура → РегистрСведений | Парсинг Запрос.Текст |
| TRIGGERS | Подписка → Общий модуль | ПодпискаНаСобытие |
| MOVES | Документ → РегистрНакопления | Движения.<Регистр>.Записать() |
| CALLS | Процедура → Процедура | Разбор вызовов с типами параметров |

Через MCP агент делает запросы вида:

{
  "method": "graph.related",
  "params": {
    "node": "Document.РеализацияТоваровУслуг",
    "edgeTypes": ["WRITES_TO", "READS_FROM"],
    "depth": 2,
    "targetKind": "РегистрСведений"
  }
}

И получает точный срез — только те объекты и модули, где действительно есть неявная связь.

Практический сценарий: «Кто пишет в ЦеныНоменклатуры?»

Без Графона тимлид запускает grep по всей выгрузке. Агент читает 40 файлов, теряет контекст, начинает галлюцинировать.

С Графоном запрос через MCP укладывается в один вызов:

{
  "method": "graph.findWriters",
  "params": {
    "register": "РегистрСведений.ЦеныНоменклатуры",
    "includeRoutines": true,
    "includeSubscriptions": true
  }
}

Ответ (сокращён):

{
  "writers": [
    {
      "node": "Document.УстановкаЦенНоменклатуры",
      "routine": "ОбработкаПроведения",
      "line": 412,
      "confidence": 0.98
    },
    {
      "node": "CommonModule.Ценообразование",
      "routine": "ЗаписатьЦену",
      "line": 1180,
      "confidence": 0.91
    },
    {
      "node": "Subscription.ПередЗаписьюЦены",
      "handler": "CommonModule.Ценообразование.ПередЗаписьюЦены",
      "confidence": 0.87
    }
  ]
}

Агент получает ровно три файла — не сорок.

Сравнение: токены и время

Замеры на выгрузке 1С:ERP 2.5 (XML ~1,4 ГБ, BSL ~11 млн строк).

| Метрика | Без Графона | С Графоном | Выигрыш |
|---|---|---|---|
| Файлов в контексте | 40–120 | 3–6 | 20–30× |
| Входные токены на задачу | 180 000 | 14 000 | 12,8× |
| Время первого ответа агента | 4 мин 20 с | 27 с | 9,6× |
| Галлюцинаций на 10 задач | 4–6 | 0–1 | ≈5× |
| Стоимость 100 задач (Claude Sonnet) | ~$54 | ~$4,2 | 12,8× |

Графон — локальный инструмент: индексирует ваш .cf/XML, ничего не отправляет в облако. Это критично для проектов с NDA и внутренними регламентами ИБ.

Как подключить Графон к Claude Code / Cursor

Минимальная конфигурация MCP-клиента:

{
  "mcpServers": {
    "grafon": {
      "command": "grafon-mcp",
      "args": ["--project", "/opt/1c/erp-2.5", "--index", "/var/grafon/erp25.grf"],
      "env": {
        "GRAFON_MODE": "readonly",
        "GRAFON_LOG": "warn"
      }
    }
  }
}

После запуска в Claude Code доступны инструменты grafon.graph.related, grafon.graph.findWriters, grafon.bsl.signature, grafon.query.explain. Cursor и Windsurf видят те же инструменты через MCP автоматически.

Типовые задачи, где граф незаменим

  1. Аудит проведения документа. Все регистры (сведений, накопления, бухгалтерии), куда пишет ОбработкаПроведения и её подписки.
  2. Поиск мёртвого кода. Процедуры, у которых нет входящих рёбер CALLS и нет подписок.
  3. Трассировка «почему изменилась цена». От записи в ЦеныНоменклатуры назад к документу-источнику по рёбрам WRITES_TO.
  4. Рефакторинг подсистемы. Понимание, какие общие модули будут затронуты при изменении реквизита документа.
  5. Онбординг LLM на кастом. Дообучение контекста агента только на релевантном срезе графа.

Итог: граф вместо «скормить всё»

Поиск неявных связей через регистры сведений и документы — это не задача полнотекстового поиска. Это задача графового анализа. XML-метаданные показывают лишь 30% связей; остальные 70% живут в BSL и текстах запросов.

Grafon превращает эти 70% в первоклассных участников графа и отдаёт LLM-агенту через MCP только релевантный срез. Результат: в 10–13 раз меньше токенов, на порядок меньше галлюцинаций, работа с 1С:ERP и ЗУП становится предсказуемой даже для средних моделей.

Начните с одного вопроса — «кто пишет в этот регистр сведений?» — и вы увидите разницу за одну сессию.