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С
Пайплайн работы:
- Индексация — парсинг XML-метаданных и модулей BSL, извлечение сигнатур, текстов запросов и подписок.
- Построение графа — связи «документ → движения», «регистр → измерения/ресурсы», «процедура → вызовы», «запрос → используемые поля».
- MCP-запрос — агент вызывает инструмент и получает компактный срез.
- Генерация — запрос пишется по реальным именам полей, без галлюцинаций.
Индексация инкрементальная: пересчитываются только изменившиеся файлы (по хэшу), поддерживается режим отслеживания каталога.
Подключение Графона к 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 |
| Проверка человеком | полная перепроверка | выборочная |
Разница возникает не из-за «более умного промпта», а из-за того, что агент работает с графом зависимостей, а не с плоским текстом.
Как формулировать задачи агенту
- Указывайте тип объекта и его роль: «регистр накопления остатков», «регистр бухгалтерии с субконто».
- Просите явно: «используй
grafon.get_object_schemaперед написанием запроса». - Задавайте период и отбор словами — агент подставит корректную виртуальную таблицу.
- Требуйте валидацию: «прогони текст через
grafon.resolve_query_fields». - Для оптимизации просите
find_usagesи анализ индексов.
Типичные ошибки, которые закрывает граф
- Несуществующий реквизит или измерение.
- Соединение по полю, которого нет в виртуальной таблице.
Остатки()без параметров периода — синтаксически валидно, семантически неверно.- Путаница остатков, оборотов и остатков-оборотов.
- Обращение к
ХарактеристикаНоменклатурыбез учёта плана видов характеристик. - Неверные псевдонимы при соединении виртуальных таблиц.
- Отсутствие учёта
ПометкаУдаленияиПроведен.
Локальность и безопасность
Графон работает полностью локально: индексирует каталог выгрузки, хранит граф на диске, не отправляет метаданные и код во внешние сервисы. Наружу уходит только тот срез, который агент явно запросил через MCP, — это важно для контуров с коммерческой тайной и требованиями ИБ.
Итог
Генерация запросов 1С с помощью ИИ-агентов становится надёжной только тогда, когда агент видит реальную схему данных. Графон превращает гигабайты XML и BSL в компактный граф и отдаёт его по MCP: до 10 раз меньше токенов, единицы итераций вместо десятков, предсказуемый результат без галлюцинаций. Подключите MCP-сервер к Claude Code, Cursor или Windsurf и попросите агента написать первый запрос — разница в качестве и стоимости видна уже на второй задаче.