24 сентября 2026 г.
Навигация по процедурам и функциям 1С без переполнения токенов: MCP-архитектура на базе Графона
Почему типичная 1С «не влезает» в контекст ИИ-агента
Любая типовая конфигурация — ERP 2.5, УТ 11, ЗУП 3.1, КА 2 — это:
- 30–60 тыс. объектов метаданных и форм;
- 8–15 ГБ XML-выгрузки в формате Конфигуратора;
- 400 000–1 200 000 строк кода на BSL, размазанных по общим модулям, модулям объектов, менеджеров, форм и подписок на события.
Если подключить ИИ-агента напрямую к репозиторию, то при первом же вопросе типа «где вызывается ПроверитьЗаполнениеРеквизитов» агент начнёт «грепать» файлы, подтягивать целые модули и за пару итераций упрётся в лимит контекста. Дальше — классический сценарий: модель теряет часть ранних сообщений, путает одноимённые процедуры в разных модулях (а в 1С их тысячи), начинает «дорисовывать» сигнатуры и галлюцинировать методы, которых не существует.
Практический замер на УТ 11.5 (1.1 млн строк BSL + XML):
| Сценарий | Контекст на запрос | Стоимость 100 запросов (Claude Sonnet) | Точность ответа |
|---|---|---|---|
| Прямое чтение репо агентом | 180–250 тыс. токенов | ~$45–60 | 40–55% |
| Grep + пошаговое чтение | 60–120 тыс. токенов | ~$18–25 | 60–70% |
| MCP-навигация через Графон | 6–18 тыс. токенов | ~$2–4 | 92–97% |
Разница в 8–12 раз по токенам — это не «оптимизация», это разница между рабочим агентом и бесполезным.
Что именно ломается в контексте 1С
1С плохо ложится на «наивный» RAG по трём причинам:
- Идентификаторы не уникальны.
ПриЗаписи,ПередЗаписью,ПриОткрытии,ЗаполнитьПоУмолчаниюповторяются в сотнях модулей. Без графа объектов агент не знает, о каком именно модуле речь. - Сигнатуры важнее тел. Чтобы ответить «как вызвать
РаботаСФайлами.ДобавитьФайл», тебе нужен не весь общий модуль на 40 000 строк, а только одна процедура + её зависимости. - Глубокая транзитивность. Форма → обработчик → общий модуль → менеджер объекта → подписка на событие → запрос. Без графа эта цепочка восстанавливается перебором файлов.
Как работает MCP-сервер Графон
Графон — локальный инструмент и MCP-сервер (https://grafonbase.ru). Он индексирует выгрузку конфигурации 1С и строит граф:
- объектов метаданных (Справочник, Документ, РегистрСведений, …);
- процедур и функций с их сигнатурами, экспорт-флагами и областями (#Область);
- вызовов (кто вызывает кого), включая косвенные через Выполнить() и Вычислить();
- подписок на события (ПодпискиНаСобытия);
- запросов BSL с разбором таблиц-источников;
- ролей, RLS и прав на объекты.
Дальше ИИ-агент через MCP (Model Context Protocol) обращается к Графону как к «умному индексу». Модель больше не читает XML и модули целиком — она получает точный срез: сигнатуру + тело в 20–80 строк + список вызывающих и вызываемых узлов.
Архитектура
┌───────────────────────┐ MCP (stdio / SSE) ┌─────────────────────┐
│ Claude Code / Cursor │ ──────────────────────► │ Grafon MCP Server │
│ Windsurf / Roo Code │ ◄────────────────────── │ (локально, Rust) │
└───────────────────────┘ JSON-срез по узлу └──────────┬──────────┘
│
┌────────▼─────────┐
│ Граф 1С (SQLite)│
│ XML + BSL index │
└──────────────────┘
Практические MCP-запросы
Пример конфигурации MCP-клиента (Claude Code ~/.claude/mcp.json):
{
"mcpServers": {
"grafon": {
"command": "grafon",
"args": ["mcp", "--config", "/opt/1c/exchange/ut11"]
}
}
}
Типовые вызовы инструментов Графона из агента:
{"tool": "grafon.find_procedure", "args": {"name": "ЗаполнитьПоУмолчанию", "owner": "Документ.РеализацияТоваровУслуг"}}
{"tool": "grafon.get_signature", "args": {"fqn": "ОбщийМодуль.РаботаСФайлами.ДобавитьФайл"}}
{"tool": "grafon.find_callers", "args": {"fqn": "Документ.РеализацияТоваровУслуг.МодульОбъекта:ОбработкаПроведения", "depth": 2}}
{"tool": "grafon.slice", "args": {"fqn": "ОбщийМодуль.ОбщегоНазначения.ЗначениеРеквизитаОбъекта", "with_body": true}}
{"tool": "grafon.event_subscribers", "args": {"event": "ПередЗаписью", "target": "Документ.РеализацияТоваровУслуг"}}
Ответ grafon.slice — это уже готовый компактный «сэндвич», например:
FQN: ОбщийМодуль.РаботаСФайлами.ДобавитьФайл
Сигнатура: Функция ДобавитьФайл(Владелец, ИмяФайла, ДвоичныеДанные, Комментарий = "") Экспорт
Вызовы (depth=1): ОбщегоНазначения.ЗначениеРеквизитаОбъекта, РаботаСФайламиСлужебный.ЗаписатьВерсию
Подписки: нет
Размер среза: 61 строка / ~1.2k токенов
Именно этот срез попадает в контекст модели — не 4000 строк общего модуля, а 61 строка.
Как это выглядит в реальном BSL-сценарии
Допустим, задача: «Найди, почему при проведении реализации не пишется регистр ТоварыОрганизаций, и предложи фикс».
Без Графона агент делает 5–7 итераций grep по ОбработкаПроведения, каждый раз затягивает большой кусок модуля документа, потом общий модуль Проведение, потом ещё 2–3 процедуры — итого 200+ тыс. токенов.
С Графоном агент делает один вызов цепочки:
{"tool": "grafon.trace_path", "args": {
"from": "Документ.РеализацияТоваровУслуг.МодульОбъекта:ОбработкаПроведения",
"to": "РегистрНакопления.ТоварыОрганизаций",
"max_depth": 4
}}
Графон возвращает 4 узла с сигнатурами и микросрезами тел (~5 800 токенов). Дальше модель точно видит: ОбработкаПроведения → ПровестиПоРегистрам (общий модуль ПроведениеСервер) → Движения.ТоварыОрганизаций.Записывать = Истина встречается только при Если Ссылка.ВидОперации = .... Галлюцинации нет — есть конкретная строка.
Пример запроса из агента в Cursor
// Задача: найти все экспортные функции модуля, которые вызываются из подписок на ПередЗаписью
// Агент запрашивает у Графона граф, а не читает модуль целиком
ПодпискиНаПередЗаписью = Графон.event_subscribers("ПередЗаписью");
Для Каждого Подписка Из ПодпискиНаПередЗаписью Цикл
Срез = Графон.slice(Подписка.Обработчик, С Телом:= Ложь);
// Возвращается только сигнатура + список вызываемых узлов
КонецЦикла;
Сравнение по сценариям
| Задача | Без Графона (токенов) | С Графоном (токенов) | Экономия |
|---|---|---|---|
| Найти все вызовы процедуры по всей конфигурации | 120 000 | 9 500 | ~12x |
| Разобрать 5 подписок на событие | 85 000 | 7 200 | ~11x |
| Построить цепочку форма → регистр | 210 000 | 14 800 | ~14x |
| Отрефакторить общий модуль (350 процедур) | 320 000 (не влезает) | 21 000 | — |
| Code review модуля документа (12 000 строк) | 95 000 | 6 900 | ~13x |
Скорость: один MCP-вызов Графона отрабатывает за 15–80 мс на графе из 1 млн узлов, тогда как «слепое» чтение файлов ИИ-агентом добавляет 30–120 секунд на итерацию.
Что даёт Графон инженерной команде
- Детерминированный контекст. Один и тот же узел всегда отдаёт одинаковый срез — воспроизводимость ответов модели.
- Совместимость с любым MCP-клиентом. Claude Code, Cursor, Windsurf, Roo Code, Cline, Zed — любой агент с поддержкой Model Context Protocol подключается одной строкой конфигурации.
- Локальная работа. Никаких выгрузок кода во внешние облака. Графон работает на той же машине, где лежит выгрузка.
- Ускорение онбординга. Новый разработчик (или ИИ-агент) получает навигацию по ERP так, как будто у него IDE с full-text search и call hierarchy.
- Экономия бюджета. На команде из 5 разработчиков с интенсивным использованием Claude Code экономия на токенах окупает внедрение за 2–3 недели.
Интеграция за 15 минут
# 1. Установить Графон (локально)
curl -sSL https://grafonbase.ru/install.sh | sh
2. Проиндексировать выгрузку конфигурации
grafon index /opt/1c/exchange/ut11 --exclude-forms=false
3. Запустить MCP-сервер
grafon mcp --config /opt/1c/exchange/ut11 --transport stdio
Затем добавляете в mcp.json Claude Code или настройки Cursor — и агент получает инструменты find_procedure, slice, find_callers, trace_path, event_subscribers. Всё — навигация по процедурам и функциям 1С без переполнения токенов становится базовым режимом работы, а не хаком.
Итог
Навигация по 1С без переполнения токенов — это задача не про «более дешёвую модель», а про правильный индекс. Пока ИИ-агент «грепает» гигабайты XML, он физически не может быть точным и дешёвым. Графон превращает конфигурацию 1С в граф и отдаёт через MCP ровно те узлы, которые нужны для текущей задачи. Результат — до 10x меньше токенов, до 5x быстрее итерации, отсутствие галлюцинаций на одноимённых процедурах и возможность заводить в контекст реальные ERP-масштабы.