Все статьи

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

Как ИИ-агенту разобраться в типовой конфигурации УТ 11: граф зависимостей, MCP и экономия токенов в 10 раз

Почему ИИ-агент «слепнет» на типовой УТ 11

Типовая «Управление торговлей 11» — это не один проект, а гигантский монолит из нескольких тысяч объектов метаданных. В поставке УТ 11.5 содержится:

  • ~3 500 объектов метаданных (справочники, документы, регистры, общие модули, обработки);
  • свыше 700 общих и объектных модулей;
  • более 1 200 000 строк кода на языке BSL;
  • выгрузка в XML-файлы конфигурации — это 4–8 ГБ на диске.

Когда вы открываете такой проект в Claude Code, Cursor или Windsurf и просите: «Найди, где формируется себестоимость товаров в документе РеализацияТоваровУслуг», — происходит катастрофа:

  1. Агент начинает индексировать всё дерево и наполнять контекст «на всякий случай».
  2. Контекстное окно (даже 200k токенов у Claude) переполняется уже на этапе чтения двух-трёх модулей.
  3. Агент начинает галлюцинировать: выдумывает методы РассчитатьСебестоимость(), которых нет, путает модули МенеджерДокумента и МодульОбъекта.
  4. Стоимость одного запроса вырастает в 8–15 раз из-за кэш-промахов и повторных чтений.

Проблема не в модели. Проблема в том, что языковые модели не умеют эффективно навигировать по конфигурации, в которой больше связей, чем файлов.

Что именно нужно ИИ-агенту от УТ 11

Агенту не нужно «всё». Ему нужен точный срез — минимальное подмножество метаданных, достаточное для ответа на вопрос:

| Что спрашивает разработчик | Что реально нужно агенту |
|---|---|
| Где рассчитывается себестоимость? | 1 процедура + 3–5 вызываемых функций + подписки на события |
| Какие реквизиты у документа РеализацияТоваровУслуг? | 1 объект метаданных + справочники типов его реквизитов |
| Кто подписан на ПередЗаписью у регистра «ТоварыНаСкладах»? | Список подписок + 2–4 обработчика |
| Как устроен учёт НДС в реализации? | Граф вызовов от формы до регистров |

Проблема в том, что связи между этими сущностями неявные: часть — в XML метаданных, часть — в BSL-коде (ОбщегоНазначения.ЗначениеРеквизитаОбъекта(), ПодключаемыеКоманды, ПодпискиНаСобытия). Без графа зависимостей агент вынужден открывать всё подряд.

Графон: локальный MCP-сервер поверх графа 1С

[Графон](https://grafonbase.ru) — это локальный инструмент, который один раз анализирует конфигурацию (ERP, УТ, ЗУП, КА, отраслевые) и строит граф зависимостей метаданных, функций, процедур, подписок и запросов. Далее этот граф публикуется как MCP-сервер — стандартный протокол, с которым умеют работать Claude Code, Cursor, Windsurf, Roo Code.

Ключевая идея: агент больше не читает файлы напрямую. Он задаёт вопрос графу — и получает ровно тот набор файлов и сигнатур, который нужен.

Архитектура

┌────────────────────┐        MCP (stdio / SSE)        ┌──────────────────────┐
│  Claude Code /     │  ─────────────────────────────▶ │   Графон MCP-server  │
│  Cursor / Windsurf │  ◀───────────────────────────── │                      │
└────────────────────┘   JSON: сигнатуры, file paths   └──────────┬───────────┘
                                                                  │
                                                    ┌─────────────▼────────────┐
                                                    │  Локальный граф Rust/SQLite │
                                                    │  • objects (3 500)         │
                                                    │  • modules (700+)          │
                                                    │  • procedures (120 000+)   │
                                                    │  • calls / subscriptions   │
                                                    │  • query references        │
                                                    └─────────────┬────────────┘
                                                                  │
                                                    ┌─────────────▼────────────┐
                                                    │  XML + BSL исходники УТ 11 │
                                                    └──────────────────────────┘

Сервер работает полностью локально: исходники УТ 11, граф и индекс не покидают ваш компьютер. В облако уходят только срезы, которые агент явно запрашивает.

Пример: найти себестоимость в УТ 11 — без Графона и с ним

Допустим, запрос: «Почему в документе РеализацияТоваровУслуг в проводках неверная себестоимость?».

Сценарий без Графона

Агент Claude Code получает задачу и делает так:

Read: Documents/РеализацияТоваровУслуг/Ext/ObjectModule.bsl       (~4 200 строк)
Read: Documents/РеализацияТоваровУслуг/Forms/ФормаДокумента/...  (~2 800 строк)
Read: CommonModules/УправлениеСебестоимостью/Ext/Module.bsl       (~11 500 строк)
Read: CommonModules/УчетЗатрат/Ext/Module.bsl                     (~7 300 строк)
Grep: "Себестоимость" across Documents/ (все документы)
Read: Documents/Прочее...                                         (несколько лишних модулей)

Итого: ~120 000 токенов на один вопрос. Агент всё равно пропускает важный вызываемый модуль и уверенно придумывает несуществующий метод УправлениеСебестоимостью.РассчитатьПоДокументу().

Сценарий с Графоном

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

// tools/call
{
  "name": "find_symbol",
  "arguments": { "query": "Себестоимость", "scope": "Documents.РеализацияТоваровУслуг" }
}

Ответ Графона:

{
  "symbols": [
    { "fqn": "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента.РассчитатьСебестоимость",
      "kind": "procedure", "file": "Documents/РеализацияТоваровУслуг/Forms/ФормаДокумента/Ext/Form/Module.bsl",
      "line": 1420 },
    { "fqn": "ОбщийМодуль.УправлениеСебестоимостью.ПодготовитьДанныеДляРасчета",
      "kind": "function", "file": "CommonModules/УправлениеСебестоимостью/Ext/Module.bsl",
      "line": 2380 }
  ]
}

Второй вызов — получить граф вызовов от найденного метода:

{
  "name": "call_graph",
  "arguments": {
    "symbol": "ОбщийМодуль.УправлениеСебестоимостью.ПодготовитьДанныеДляРасчета",
    "depth": 2
  }
}

Третий — вытащить подписки на события, влияющие на запись:

{
  "name": "get_subscriptions",
  "arguments": { "event": "ПередЗаписью", "object": "Документ.РеализацияТоваровУслуг" }
}

После этого агент читает только указанные файлы в указанных диапазонах строк. Итог: ~11 000 токенов, а ответ точный, потому что опирается на реальный граф вызовов, а не на «угадайку».

Таблица сравнения: с Графоном и без

| Метрика | Без Графона | С Графоном | Улучшение |
|---|---|---|---|
| Токенов на один вопрос по УТ 11 | 90 000 – 150 000 | 8 000 – 15 000 | ×10 |
| Время до первого корректного ответа | 3–6 минут | 20–45 секунд | ×6 |
| Стоимость (при $3/M input у Claude Sonnet) | $0.27–0.45 | $0.024–0.045 | ×10 |
| Точность ссылок на методы | 40–60% | 98%+ | стабильно |
| Галлюцинации методов BSL | Часто | Практически исключены | — |
| Нужно грузить всю конфигурацию в контекст | Да | Нет | — |

Практический кейс: разбор подписки на событие

Возьмём реальную задачу тимлида: «Найди все подписки на ПриПроведении документа РеализацияТоваровУслуг и покажи, какие из них меняют регистр ТоварыОрганизаций».

Агент через MCP делает вызов:

{
  "name": "trace_event",
  "arguments": {
    "event": "ПриПроведении",
    "object": "Document.РеализацияТоваровУслуг",
    "affects_register": "AccumulationRegister.ТоварыОрганизаций"
  }
}

Графон возвращает упорядоченный список обработчиков с пометкой, какие из них пишут в указанный регистр через Движения.ТоварыОрганизаций. Далее агент запрашивает тело только этих подписчиков — обычно это 3–6 коротких процедур.

Вот пример такой подписки из типовой УТ 11, которую часто ищут:

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

Без графа агент, увидев вызов ПартионныйУчет.СтоимостьСписания(), с вероятностью ошибётся в параметрах — а с Графоном он получает сигнатуру:

// Сигнатура из графа
Function ПартионныйУчет.СтоимостьСписания(
    Номенклатура: СправочникСсылка.Номенклатура,
    Склад: СправочникСсылка.Склады,
    Количество: Число,
    Партия: СправочникСсылка.ПартииНоменклатуры = Неопределено
) Экспорт

И вызовет метод правильно с первого раза.

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

Claude Code

В ~/.config/claude/mcp.json:

{
  "mcpServers": {
    "grafon-ut11": {
      "command": "grafon",
      "args": ["mcp", "--project", "/projects/UT11.5"]
    }
  }
}

Claude Code сразу видит инструменты find_symbol, call_graph, get_subscriptions, trace_event, find_register_writes и другие.

Cursor

В .cursor/mcp.json проекта:

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["mcp", "--project", "${workspaceFolder}"]
    }
  }
}

После перезапуска Cursor агент при выборе инструмента предпочтёт find_symbol вместо слепого grep по гигабайту XML.

Windsurf / Roo Code

Настройка аналогичная: указывается команда запуска MCP-сервера и путь к выгрузке конфигурации (Designer-формат, файлы *.xml + Ext/Module.bsl). Первичная индексация УТ 11 занимает от 4 до 12 минут, дальнейшее обновление инкрементальное по изменённым файлам.

Что даёт граф зависимостей на практике

  1. Локализация багов. Вместо чтения дерева агент идёт по цепочке вызовов от точки входа до записи в регистр.
  2. Аудит подписок. Быстрый ответ на вопрос «что ещё срабатывает при проведении этого документа».
  3. Онбординг. Новый разработчик просит агента построить карту модуля — и получает её из графа, а не из 11 000 строк.
  4. Рефакторинг. Проверка: где вызывается метод, какие типы параметров передаются фактически.
  5. Безопасность данных. Конфигурация не уходит в облако: MCP-сервер локальный, срезы формируются на вашем железе.

Подводные камни и как их избегать

  • Формы с директивой &НаКлиенте. Графон различает контекст клиента и сервера и не даст агенту предложить вызов серверного метода из клиентского кода.
  • Расширения. Если используете расширения УТ 11, укажите --include-extensions при индексации, чтобы граф объединял методы основной конфигурации и расширений.
  • Динамические вызовы Вычислить() и Выполнить(). Такие связи строятся эвристически; Графон помечает их в ответе как dynamic: true, чтобы агент не делал поспешных выводов.
  • Общие модули с флагами компиляции. Флаг ВызовСервера/Клиент учитывается в сигнатурах.

Итог

ИИ-агент не станет экспертом по УТ 11 от того, что вы дадите ему больше контекста — наоборот, качество упадёт. Экспертиза рождается из точного графа зависимостей, по которому агент навигирует так же, как это делает опытный 1С-архитектор: от точки входа к вызываемым процедурам, от подписок к обработчикам, от запроса к регистрам.

Графон превращает 8 ГБ XML УТ 11 в структурированный MCP-интерфейс. Результат — стабильное сокращение токенов в 10 раз, ускорение ответов и почти нулевой уровень галлюцинаций. Для команд, которые уже используют Claude Code, Cursor или Windsurf на боевых проектах 1С, это разница между «игрушкой» и рабочим инструментом.

Запустить локальный MCP-сервер и проиндексировать свою конфигурацию можно на [grafonbase.ru](https://grafonbase.ru).