27 сентября 2026 г.
Поиск неявных связей через регистры сведений и документы 1С для LLM: графовый подход с MCP и Графоном
Почему обычный поиск по метаданным 1С ломает LLM-агента
Конфигурации 1С:ERP, УТ 11, ЗУП КОРП, КА 2 содержат десятки тысяч объектов метаданных и миллионы строк BSL. Когда вы подключаете к такой базе Claude Code, Cursor или Windsurf «в лоб» — через чтение XML-выгрузки и модулей с диска — агент сталкивается с двумя проблемами:
- Переполнение контекста. Файл
Document.РеализацияТоваровУслуг.xmlвесит 300–800 КБ. Общий модульУправлениеЗапасами— 4000+ строк. Даже 200k токенов не хватит, чтобы «увидеть» одну сквозную бизнес-операцию. - Потеря неявных связей. Связь между документом и регистром сведений часто реализована не через метаданные, а через BSL:
- - динамические подписки на события;
- - обращения через
РегистрыСведений.<Имя>.СоздатьМенеджерЗаписи(); - - вычисляемые измерения;
- - чтение через
Запросс параметромПериод; - - регистраторы, связанные с документом только в виртуальных таблицах.
Именно эти неявные связи 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 автоматически.
Типовые задачи, где граф незаменим
- Аудит проведения документа. Все регистры (сведений, накопления, бухгалтерии), куда пишет
ОбработкаПроведенияи её подписки. - Поиск мёртвого кода. Процедуры, у которых нет входящих рёбер
CALLSи нет подписок. - Трассировка «почему изменилась цена». От записи в
ЦеныНоменклатурыназад к документу-источнику по рёбрамWRITES_TO. - Рефакторинг подсистемы. Понимание, какие общие модули будут затронуты при изменении реквизита документа.
- Онбординг LLM на кастом. Дообучение контекста агента только на релевантном срезе графа.
Итог: граф вместо «скормить всё»
Поиск неявных связей через регистры сведений и документы — это не задача полнотекстового поиска. Это задача графового анализа. XML-метаданные показывают лишь 30% связей; остальные 70% живут в BSL и текстах запросов.
Grafon превращает эти 70% в первоклассных участников графа и отдаёт LLM-агенту через MCP только релевантный срез. Результат: в 10–13 раз меньше токенов, на порядок меньше галлюцинаций, работа с 1С:ERP и ЗУП становится предсказуемой даже для средних моделей.
Начните с одного вопроса — «кто пишет в этот регистр сведений?» — и вы увидите разницу за одну сессию.