Все статьи

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

RAG для 1С: почему векторные базы данных не работают с кодом 1С

Почему классический RAG на векторных БД ломается о код 1С

Когда команда впервые пытается подключить ИИ-агента к конфигурации 1С:ERP или ЗУП, звучит логичное решение: разрежем XML дампа на чанки, эмбеддим, положим в Qdrant или pgvector, на запрос достанем top-K похожих кусков. На демо с «привет, мир» это работает. На реальной конфигурации — рассыпается за неделю. Причина в том, что код 1С — не текстовая, а структурная сущность.

Проблема 1. Семантическая близость ≠ корректность связи

Векторный поиск ищет «похоже по смыслу». В естественном языке «проводки» и «движения» — синонимы. В BSL это разные методы, которые вызываются в разном порядке и на разных объектах:

// Документ.РеализацияТоваровУслуг.МодульОбъекта
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.Товары.Записывать = Истина;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.Товары.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.Количество = ТекСтрокаТовары.Количество;
    КонецЦикла;
    // Бухгалтерские проводки формируются ОТДЕЛЬНО, через Хозрасчетный
    СформироватьПроводкиПоРеализации();
КонецПроцедуры

Векторная БД с радостью вернёт метод СформироватьПроводки из другого документа, потому что косингулярность высокая. Агент подставит его в контекст и получит компилируемый, но семантически неверный код. Это и есть источник галлюцинаций в 1С-RAG.

Проблема 2. Чанки рвут граф вызовов

Модуль общих модулей БухгалтерскийУчет в ERP — это 40 000+ строк. Нарезка по 500 токенов разрывает:

  • сигнатуру процедуры от её тела;
  • экспортную функцию от внутренней;
  • вызов ПодключаемыеКоманды.ПриСформироватьКоманды() от подписки на событие ПередЗаписью.

Агент видит фрагмент Возврат Результат; и не понимает, что Результат — это таблица значений из совсем другого метода.

Проблема 3. Метаданные весят больше кода

В конфигурации КА 2 дамп XML — это ~6 ГБ. Из них код — единицы процентов. Эмбеддинг всей выгрузки в OpenAI-совместимую модель обойдётся в сотни долларов на одну переиндексацию, а при каждом обновлении конфигурации от поставщика её нужно повторять. При этом 90% чанков — описания форм и реквизитов, которые агенту в 95% задач просто не нужны.

Проблема 4. Top-K против реального контекста задачи

Разработчику нужно не «10 похожих кусков», а точный срез:

  1. сигнатура процедуры, которую он правит;
  2. список вызывающих её процедур;
  3. подписки на события, в которые она вовлечена;
  4. структура регистров, которые она двигает;
  5. текст запроса, который она выполняет.

Векторный поиск эту пятёрку собрать не может — у него нет понятия «вызывает» и «вызывается».

Что работает: граф зависимостей + MCP

Вместо эмбеддингов нужно один раз построить локальный граф конфигурации и ходить по нему детерминированными запросами. Именно это делает [Графон](https://grafonbase.ru) — локальный MCP-сервер для 1С:Предприятие.

Архитектура

[Выгрузка конфигурации в XML] 
        ↓ (индексация)
[Парсер BSL + Metadata Reader]
        ↓
[Граф: метаданные ↔ модули ↔ процедуры ↔ вызовы ↔ подписки ↔ запросы]
        ↓ (MCP / stdio)
[ИИ-агент: Claude Code / Cursor / Windsurf / Roo Code]

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

Что индексируется

| Узел графа | Рёбра | Пример запроса агента |
|---|---|---|
| Процедура/функция | вызывает, вызывается, экспорт | «кто вызывает ОбработкаПроведения» |
| Общий модуль | входит в подсистему | «покажи экспортные методы ОбщегоНазначения» |
| Метаданные объекта | имеет модуль, используется в запросе | «реквизиты регистра Хозрасчетный» |
| Подписка на событие | обработчик, источник | «что срабатывает на ПередЗаписью документа» |
| Запрос | таблицы, поля, временные таблицы | «где используется РегистрНакопления.ТоварыНаСкладах» |

Практический сценарий: правка проведения документа

Задача: агент должен добавить в Документ.РеализацияТоваровУслуг контроль остатков перед проведением.

Без Графона. Агент получает 15 чанков из векторной БД, включая нерелевантные модули формы, и тратит ~85 000 токенов на один запрос. В ответе — вызов несуществующего метода ПроверитьОстаткиПоРегистру (галлюцинация).

С Графоном. MCP-запрос:

{
  "method": "tools/call",
  "params": {
    "name": "get_context_for_edit",
    "arguments": {
      "object": "Document.РеализацияТоваровУслуг",
      "entrypoint": "ОбработкаПроведения",
      "depth": 2,
      "include": ["registers", "subscriptions", "called_by"]
    }
  }
}

Ответ — структурированный срез:

// ВЕРНУЛ ГРАФОН (сокращённо)
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // вызывает: ОбработкаПроведенияТовары, КонтрольОстатков
    // подписка: ПередЗаписью -> ПроверитьЗаполнениеРеквизитов
    // регистры: ТоварыНаСкладах, Хозрасчетный
КонецПроцедуры

// Экспортный метод общего модуля, который реально нужен:
Функция ОстаткиПоРегистру(Регистр, Отбор, МоментВремени) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ИЗ РегистрНакопления." + Регистр;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Агент получает ровно то, что нужно, и ~7 500 токенов вместо 85 000.

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

| Метрика | Векторная БД (RAG) | Графон (граф + MCP) |
|---|---|---|
| Токенов на задачу правки | 60 000 – 120 000 | 5 000 – 12 000 |
| Время ответа агента | 40–90 сек | 6–15 сек |
| Галлюцинации методов | 25–40% ответов | <3% |
| Переиндексация при обновлении КФ | 2–6 часов + $ | 1–3 минуты, локально |
| Понимание вызовов и подписок | нет | да |
| Стоимость на 1000 задач | $180–400 | $15–40 |

Ключевой экономический эффект — до 10x меньше токенов при более высокой корректности.

Типовые вопросы, где граф незаменим

  1. «Кто сломает проведение, если я поменяю сигнатуру?» — Графон возвращает список всех вызывающих процедур с указанием модуля и строки.
  2. «Какие подписки затронут запись справочника?» — прямой запрос по рёбрам Подписка → Обработчик.
  3. «Где используется временная таблица ВТ_Остатки — поиск по узлам Запрос.
  4. «Рефакторинг общего модуля» — агент видит только экспортные методы и их потребителей, не загружая всё тело модуля.

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

  1. Скачайте и запустите индексацию выгрузки: grafon index path/to/config_xml.
  2. Добавьте MCP-сервер в конфиг вашего агента:
{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["mcp", "--workspace", "./config_xml"]
    }
  }
}
  1. В промпте агента опишите правило: «Перед правкой любого BSL-модуля вызывай get_context_for_edit. Не предполагай имена методов — только те, что вернул Графон».

После этого агент работает по графу, а не по вероятностям эмбеддингов.

Вывод

Векторные базы данных хороши для документов и чатов, но плохи для исполняемого кода. У кода нет синонимов, зато есть строгий граф зависимостей, который нужно обходить, а не «угадывать по близости». Для 1С это критично: конфигурации слишком велики, чтобы пихать их в контекст, и слишком связаны, чтобы резать на чанки без потерь.

Правильный RAG для 1С — это не RAG. Это GraphRAG плюс MCP-сервер. [Графон](https://grafonbase.ru) ровно это и делает: локально, без облака, с 10-кратной экономией токенов и практически без галлюцинаций.