Все статьи

4 октября 2026 г.

Вайтпейпер Grafon: сокращение стоимости токенов для 1С команд до 10 раз

Проблема: контекстное окно против гигабайтов метаданных

Типовая ERP 2.5 или УТ 11 после выгрузки в XML — это порядка 1,5 ГБ файлов, десятки тысяч модулей и общие модули верхнего уровня по 20 000–40 000 строк BSL. Одна строка кода — в среднем 8–12 токенов. Значит, только один крупный общий модуль стоит 250–400 тысяч токенов и в одиночку переполняет контекстное окно большинства моделей.

Что происходит, когда агенту ставят задачу «добавь реквизит ОтветственныйМенеджер в документ ЗаказКлиента и учти его в проведении»? Агент читает модуль объекта, модуль менеджера, форму документа, общий модуль проведения, модуль набора записей регистра — и суммарно съедает 400 000–700 000 токенов ещё до первой строки нового кода. Дальше всё по учебнику: десятикратный перерасход бюджета, потеря информации в середине контекста, галлюцинации с именами несуществующих процедур и дублирование уже написанных методов.

Что такое Grafon

Grafon — локальный инструмент и MCP-сервер для конфигураций 1С:Предприятие. Он разбирает всю конфигурацию, строит граф зависимостей между метаданными, модулями, процедурами, подписками на события и запросами, а затем через протокол Model Context Protocol отдаёт ИИ-агенту (Claude Code, Cursor, Windsurf, Roo Code) только точный срез связанных файлов и сигнатур вместо гигабайтов XML.

Ключевая идея: агент не «читает конфигурацию», а задаёт вопросы графу. Индекс и граф живут локально, ничего не уходит во внешние сервисы.

Архитектура Grafon

1. Резолвер конфигурации. Читает выгрузку в форматах конфигуратора (.xml, .bsl, .form) и EDT-проект (.mdo, .bsl, .form), восстанавливает дерево метаданных, состав реквизитов, табличных частей, измерений и ресурсов регистров.

2. Индексатор BSL. Разбирает модули в AST: экспортные и неэкспортные процедуры, директивы компиляции (&НаСервере, &НаКлиенте, &НаСервереБезКонтекста), параметры, вызовы, обращения к метаданным через строковые литералы (Документы.ЗаказКлиента, РегистрыНакопления.ТоварыНаСкладах).

3. Граф зависимостей. Узлы — метаданные, модули, процедуры, подписки, тексты запросов. Рёбра — «вызывает», «обрабатывает событие», «использует метаданные», «читает/пишет регистр». Это позволяет отвечать на вопросы вида «кто сломается, если я поменяю сигнатуру этой функции».

4. MCP-сервер. Отдаёт граф агентам по stdio или HTTP. Каждый инструмент возвращает компактный структурированный ответ с точными путями к файлам и диапазонами строк.

Набор MCP-инструментов

| Инструмент | Что возвращает | Типичный размер ответа |
|---|---|---|
| find_metadata | Объект метаданных и его состав | 300–800 токенов |
| get_module_outline | Список процедур модуля с сигнатурами | 500–1 500 токенов |
| resolve_call_graph | Кто вызывает и кого вызывает процедура | 800–2 500 токенов |
| find_event_subscriptions | Все подписки на событие объекта | 200–600 токенов |
| find_usages | Использования реквизита, функции, регистра | 400–2 000 токенов |
| get_query_sources | Источники данных и поля текста запроса | 300–900 токенов |
| get_diff_context | Минимальный набор файлов под задачу | 2 000–8 000 токенов |

Пример сессии: Claude Code + Grafon

Агент получает задачу и первым делом запрашивает контекст у графа:

{
  "method": "tools/call",
  "params": {
    "name": "get_diff_context",
    "arguments": {
      "target": "Документ.ЗаказКлиента",
      "change": "add_attribute",
      "attribute": "ОтветственныйМенеджер",
      "include": ["event_subscriptions", "posting_modules", "forms"]
    }
  }
}

Ответ содержит 12 сигнатур, 3 фрагмента модулей по 40–60 строк и список связанных подписок — примерно 4 200 токенов вместо 480 000 при полном чтении модулей.

Что именно попадает в граф

Обработчик подписки на событие индексируется как отдельный узел с привязкой к объекту-источнику:

// Общий модуль ПроведениеДокументов
Процедура ПередЗаписьюЗаказаКлиента(Источник, Отказ) Экспорт
    
    Если Не ЗначениеЗаполнено(Источник.ОтветственныйМенеджер) Тогда
        Отказ = Истина;
        ОбщегоНазначения.СообщитьПользователю(
            НСтр("ru = 'Не заполнен ответственный менеджер'"), , Источник.Ссылка);
    КонецЕсли;
    
    // Графон связывает этот вызов с процедурой ПолучитьНастройкиПродаж
    Настройки = ПродажиСервер.ПолучитьНастройкиПродаж(Источник.Дата);
    
КонецПроцедуры

Агент, получив такую карточку от resolve_call_graph, видит сигнатуру ПолучитьНастройкиПродаж, её директивы компиляции и место вызова — без чтения всего 30-тысячестрочного общего модуля:

// Функция ПродажиСервер.ПолучитьНастройкиПродаж
//
// Параметры:
//  Дата - Дата - дата, на которую определяются настройки
//
// Возвращаемое значение:
//  Структура - см. ПродажиСервер.СхемаНастроекПродаж
//
Функция ПолучитьНастройкиПродаж(Дата) Экспорт
    // ...
КонецФункции

Тексты запросов индексируются как отдельные узлы с разбором источников — это критично для задач оптимизации:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|   Товары.Номенклатура КАК Номенклатура,
|   Товары.Сумма КАК Сумма
|ИЗ
|   Документ.ЗаказКлиента.Товары КАК Товары
|ГДЕ
|   Товары.Ссылка = &Ссылка
|УПОРЯДОЧИТЬ ПО
|   Сумма УБЫВ";
Запрос.УстановитьПараметр("Ссылка", Ссылка);

get_query_sources вернёт: источник Документ.ЗаказКлиента.ТабличнаяЧасть.Товары, поля Номенклатура, Сумма, отсутствие соединений — этого достаточно, чтобы предложить добавить индекс или переписать запрос без выгрузки всего модуля.

Сравнение: без Графона и с Графоном

| Сценарий | Без Графона (токены) | С Графоном (токены) | Выигрыш | Время агента |
|---|---|---|---|---|
| Добавить реквизит в документ | ~480 000 | ~4 200 | 114x | 2 мин → 20 сек |
| Найти всех подписчиков события | ~260 000 | ~600 | 430x | 3 мин → 8 сек |
| Кто вызывает общий модуль | ~350 000 | ~2 200 | 160x | 4 мин → 15 сек |
| Разобрать текст запроса | ~180 000 | ~900 | 200x | 1 мин → 10 сек |
| Рефакторинг функции (10 модулей) | ~700 000 | ~8 000 | 88x | 12 мин → 1,5 мин |
| Онбординг в чужую конфигурацию | ~900 000 | ~25 000 | 36x | часы → минуты |

Заявленные «до 10 раз» в вайтпейпере — консервативная оценка на уровне всего проекта: на отдельных запросах экономия доходит до двух порядков, но по мере роста задачи агент всё равно собирает несколько срезов.

Практические сценарии для 1С-команды

  1. Безопасный рефакторинг. Перед переименованием процедуры агент вызывает find_usages и получает полный список вызовов с файлами и строками — вместо поиска глазами по всей конфигурации.
  2. Аудит подписок. find_event_subscriptions собирает все обработчики ПередЗаписью, ПриЗаписи, ПередУдалением, включая чужие доработки в расширениях. Это готовый отчёт для проверки производительности.
  3. Работа с типовыми и расширениями. Графон различает объекты основной конфигурации и расширений, поэтому агент понимает, что доработка живёт в расширении, и не предлагает правку типового модуля.
  4. Разбор чужих конфигураций. Новый разработчик за час получает карту ключевых модулей вместо двух недель чтения.

Внедрение

Подключение к Claude Code занимает один конфиг:

{
  "mcpServers": {
    "grafon": {
      "command": "grafon-mcp",
      "args": ["--config", "C:/1C/erp25", "--mode", "edt", "--exclude", "Формы//Форма"]
    }
  }
}

Дальше — индексация и работа:

grafon index ./erp25 --incremental
grafon serve --port 8787
grafon stats --tokens-saved

--incremental переиндексирует только изменённые модули, поэтому обновление после git pull занимает секунды. Команда stats показывает фактическую экономию токенов по проекту — это удобно для отчётности перед финансовым директором.

Экономика

Возьмём команду из 15 разработчиков, каждый делает 25 обращений к агенту в день. Без графа средний запрос — ~120 000 входных токенов, с графом — ~9 000. Экономия ~111 000 токенов на запрос, или ~41 млн входных токенов в месяц. На тарифах крупных моделей это десятки тысяч долларов в месяц только на входном контексте — плюс сокращение времени агента, которое пересчитывается в человеко-часы напрямую.

Ограничения

  • Граф нужно переиндексировать после изменений — для больших конфигураций первичная индексация ERP занимает несколько минут.
  • Динамические вызовы через Вычислить() и строковые имена процедур индексируются частично: такие места стоит проверять вручную.
  • Модули с большим объёмом кода внутри одной процедуры срезаются хуже — декомпозиция по-прежнему нужна.

Итог

Grafon не заменяет ИИ-агента — он убирает главный источник его ошибок и расходов: избыточный контекст. Граф зависимостей метаданных, процедур, подписок и запросов превращает «прочитай всё» в «прочитай ровно это», снижая стоимость токенов до 10 раз на уровне проекта и до двух порядков на отдельных запросах. Для 1С-команд это означает предсказуемый бюджет на ИИ-ассистентов, меньше галлюцинаций и агента, который действительно понимает структуру конфигурации, а не угадывает её.