Все статьи

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

Генерация запросов 1С с помощью ИИ-агентов с учётом схемы данных: практика с MCP-сервером Графон

Почему ИИ-агент не умеет писать запросы 1С «из головы»

Языковая модель обучена на публичном коде, но не на XML-выгрузке вашей конфигурации. Она не знает, что в вашем контуре регистр называется ТоварыНаСкладах, а не ОстаткиТоваров, что табличная часть документа РеализацияТоваровУслугТовары, а не Состав, и что у регистра ЦеныНоменклатуры измерение называется ХарактеристикаНоменклатуры, а не Характеристика.

В типовой ERP 2.5 — более 100 000 объектов метаданных, десятки тысяч модулей и гигабайты XML. УТ 11, ЗУП 3.1, КА 2 — тот же порядок величин. Если скормить это агенту целиком:

  • контекстное окно переполняется после 2–3 файлов метаданных;
  • агент «домысливает» имена реквизитов и виртуальных таблиц;
  • стоимость задачи вырастает в 5–10 раз из-за перерасхода токенов;
  • появляются некомпилируемые запросы: РегистрНакопления.ТоварыНаСкладах.Остатки() без параметров периода и отбора.

Результат — не «умный помощник», а генератор синтаксически корректного, но семантически неверного BSL, который приходится перепроверять полностью. Проблема не в модели, а в отсутствии доступа к актуальной схеме данных.

Что такое схема данных 1С и почему это граф

Схема данных в 1С — это не только список таблиц. Это связная структура:

  • Объекты метаданных: справочники, документы, регистры сведений/накопления/бухгалтерии, планы видов характеристик, бизнес-процессы.
  • Иерархия полей: реквизиты, измерения, ресурсы, табличные части, стандартные поля (Ссылка, ПометкаУдаления, Период).
  • Виртуальные таблицы: .Остатки(), .Обороты(), .ОстаткиИОбороты(), .СрезПоследних(), .СрезПервых() с собственными наборами параметров и полей.
  • Связи: регистраторы движений, подчинённость, ведущие измерения, ссылочные типы, состав планов видов характеристик.
  • Код: сигнатуры процедур и функций, вызовы, подписки на события, собственные тексты запросов в модулях.

Это классический ориентированный граф: узлы — метаданные и подпрограммы, рёбра — зависимости и использование. Именно по такому графу ИИ-агент может получить точный срез вместо всей конфигурации.

Архитектура: Графон как MCP-сервер для 1С

Графон — локальный инструмент и MCP-сервер. Он индексирует выгрузку конфигурации на диске и отдаёт агенту ровно тот фрагмент схемы, который нужен для текущей задачи.

Claude Code / Cursor / Windsurf / Roo Code
                │  MCP (stdio / SSE)
                ▼
        Grafon MCP Server
     ┌──────────┼───────────┐
     │          │           │
 Индексер    Граф       Поиск
 (XML+BSL)  (узлы/рёбра) (полнотекст)
     │          │           │
     └──────────┴───────────┘
                │
   Каталог выгрузки конфигурации 1С

Пайплайн работы:

  1. Индексация — парсинг XML-метаданных и модулей BSL, извлечение сигнатур, текстов запросов и подписок.
  2. Построение графа — связи «документ → движения», «регистр → измерения/ресурсы», «процедура → вызовы», «запрос → используемые поля».
  3. MCP-запрос — агент вызывает инструмент и получает компактный срез.
  4. Генерация — запрос пишется по реальным именам полей, без галлюцинаций.

Индексация инкрементальная: пересчитываются только изменившиеся файлы (по хэшу), поддерживается режим отслеживания каталога.

Подключение Графона к Claude Code и Cursor

Конфигурация MCP-сервера:

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["mcp", "--config", "/srv/1c/erp-2.5.21"]
    }
  }
}

Агент получает набор инструментов:

| Инструмент | Назначение |
|---|---|
| grafon.search_metadata | поиск объекта по имени/синониму |
| grafon.get_object_schema | поля, табличные части, измерения, ресурсы |
| grafon.virtual_table | параметры и колонки виртуальной таблицы |
| grafon.resolve_query_fields | проверка существования полей в тексте запроса |
| grafon.find_usages | где объект используется в коде и запросах |
| grafon.get_procedures | сигнатуры процедур и функций модуля |
| grafon.movements | регистры-регистраторы документа |

Пример вызова:

{
  "tool": "grafon.get_object_schema",
  "arguments": {
    "kind": "РегистрНакопления",
    "name": "ТоварыНаСкладах",
    "include": ["Измерения", "Ресурсы", "Реквизиты", "ВиртуальныеТаблицы"]
  }
}

Ответ — компактный JSON на 2–4 КБ вместо сотен мегабайт XML. Именно здесь и возникает десятикратная экономия.

Сценарий 1: остатки номенклатуры по складам

Промпт: «Нужен запрос: остатки товаров по складам на конец периода, только ненулевые, отбор по списку складов».

Без схемы данных агент почти гарантированно напишет РегистрНакопления.ТоварыНаСкладах.Остатки() без параметров или придумает поле КоличествоКонечныйОстаток. С Графоном агент сначала получает измерения (Склад, Номенклатура), ресурс (Количество) и сигнатуру виртуальной таблицы:

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

Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("СписокСкладов", СписокСкладов);

Выборка = Запрос.Выполнить().Выбрать();

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

Сценарий 2: соединение документа и регистра

Задача: «Себестоимость проданных товаров по реализациям за квартал».

Агент вызывает grafon.movements для Документ.РеализацияТоваровУслуг и получает список регистров-регистраторов. Далее — grafon.get_object_schema для нужного регистра и grafon.resolve_query_fields для валидации текста.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	РеализацияТоваровУслугТовары.Ссылка КАК Реализация,
|	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
|	РеализацияТоваровУслугТовары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Реализация
|ИЗ
|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|	РеализацияТоваровУслугТовары.Ссылка.Проведен
|	И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|
|СГРУППИРОВАТЬ ПО
|	РеализацияТоваровУслугТовары.Ссылка,
|	РеализацияТоваровУслугТовары.Номенклатура,
|	РеализацияТоваровУслугТовары.Количество
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ВТ_Реализация.Реализация КАК Реализация,
|	ВТ_Реализация.Номенклатура КАК Номенклатура,
|	ВТ_Реализация.Количество КАК Количество,
|	ХозрасчетныйОбороты.СуммаОборот КАК Себестоимость
|ИЗ
|	ВТ_Реализация КАК ВТ_Реализация
|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(
|			&НачалоПериода, &КонецПериода, Регистратор,
|			Счет В (&СчетаЗатрат)) КАК ХозрасчетныйОбороты
|	ПО ВТ_Реализация.Реализация = ХозрасчетныйОбороты.Регистратор
|		И ВТ_Реализация.Номенклатура = ХозрасчетныйОбороты.Субконто1";

Без графа метаданных агент путает Субконто1/Субконто2, параметры Обороты(Начало, Конец, ПериодРегистрации, ...) и состав измерений. С Графоном каждый идентификатор подтверждён.

Сценарий 3: ревью и оптимизация существующего запроса

Промпт: «Проверь запрос на корректность полей и подскажи, какие индексы помогут».

Агент передаёт текст в grafon.resolve_query_fields и получает список несуществующих полей и неоднозначных ссылок. Дополнительно grafon.find_usages показывает, какие реквизиты реально используются в отборах, а grafon.virtual_table — какие параметры виртуальной таблицы влияют на план. Так появляются обоснованные рекомендации по ИНДЕКСИРОВАТЬ, составу измерений и замене ОстаткиИОбороты на Остатки.

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

Замеры на задаче «запрос по регистру с соединением документа, 3 итерации правок», ERP 2.5, Claude Code.

| Метрика | Без Графона | С Графоном |
|---|---|---|
| Контекст на итерацию | 180–260 тыс. токенов | 18–28 тыс. токенов |
| Итераций до рабочего запроса | 4–6 | 1–2 |
| Время до готового кода | 10–15 мин | 1–2 мин |
| Доля неверных имён полей | 30–45% | < 3% |
| Расходы на токены | ×1 | ×0,1–0,15 |
| Проверка человеком | полная перепроверка | выборочная |

Разница возникает не из-за «более умного промпта», а из-за того, что агент работает с графом зависимостей, а не с плоским текстом.

Как формулировать задачи агенту

  1. Указывайте тип объекта и его роль: «регистр накопления остатков», «регистр бухгалтерии с субконто».
  2. Просите явно: «используй grafon.get_object_schema перед написанием запроса».
  3. Задавайте период и отбор словами — агент подставит корректную виртуальную таблицу.
  4. Требуйте валидацию: «прогони текст через grafon.resolve_query_fields».
  5. Для оптимизации просите find_usages и анализ индексов.

Типичные ошибки, которые закрывает граф

  • Несуществующий реквизит или измерение.
  • Соединение по полю, которого нет в виртуальной таблице.
  • Остатки() без параметров периода — синтаксически валидно, семантически неверно.
  • Путаница остатков, оборотов и остатков-оборотов.
  • Обращение к ХарактеристикаНоменклатуры без учёта плана видов характеристик.
  • Неверные псевдонимы при соединении виртуальных таблиц.
  • Отсутствие учёта ПометкаУдаления и Проведен.

Локальность и безопасность

Графон работает полностью локально: индексирует каталог выгрузки, хранит граф на диске, не отправляет метаданные и код во внешние сервисы. Наружу уходит только тот срез, который агент явно запросил через MCP, — это важно для контуров с коммерческой тайной и требованиями ИБ.

Итог

Генерация запросов 1С с помощью ИИ-агентов становится надёжной только тогда, когда агент видит реальную схему данных. Графон превращает гигабайты XML и BSL в компактный граф и отдаёт его по MCP: до 10 раз меньше токенов, единицы итераций вместо десятков, предсказуемый результат без галлюцинаций. Подключите MCP-сервер к Claude Code, Cursor или Windsurf и попросите агента написать первый запрос — разница в качестве и стоимости видна уже на второй задаче.