Все статьи

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 по трём причинам:

  1. Идентификаторы не уникальны. ПриЗаписи, ПередЗаписью, ПриОткрытии, ЗаполнитьПоУмолчанию повторяются в сотнях модулей. Без графа объектов агент не знает, о каком именно модуле речь.
  2. Сигнатуры важнее тел. Чтобы ответить «как вызвать РаботаСФайлами.ДобавитьФайл», тебе нужен не весь общий модуль на 40 000 строк, а только одна процедура + её зависимости.
  3. Глубокая транзитивность. Форма → обработчик → общий модуль → менеджер объекта → подписка на событие → запрос. Без графа эта цепочка восстанавливается перебором файлов.

Как работает 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 секунд на итерацию.

Что даёт Графон инженерной команде

  1. Детерминированный контекст. Один и тот же узел всегда отдаёт одинаковый срез — воспроизводимость ответов модели.
  2. Совместимость с любым MCP-клиентом. Claude Code, Cursor, Windsurf, Roo Code, Cline, Zed — любой агент с поддержкой Model Context Protocol подключается одной строкой конфигурации.
  3. Локальная работа. Никаких выгрузок кода во внешние облака. Графон работает на той же машине, где лежит выгрузка.
  4. Ускорение онбординга. Новый разработчик (или ИИ-агент) получает навигацию по ERP так, как будто у него IDE с full-text search и call hierarchy.
  5. Экономия бюджета. На команде из 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-масштабы.