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 похожих кусков», а точный срез:
- сигнатура процедуры, которую он правит;
- список вызывающих её процедур;
- подписки на события, в которые она вовлечена;
- структура регистров, которые она двигает;
- текст запроса, который она выполняет.
Векторный поиск эту пятёрку собрать не может — у него нет понятия «вызывает» и «вызывается».
Что работает: граф зависимостей + 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 меньше токенов при более высокой корректности.
Типовые вопросы, где граф незаменим
- «Кто сломает проведение, если я поменяю сигнатуру?» — Графон возвращает список всех вызывающих процедур с указанием модуля и строки.
- «Какие подписки затронут запись справочника?» — прямой запрос по рёбрам
Подписка → Обработчик. - «Где используется временная таблица
ВТ_Остатки?» — поиск по узламЗапрос. - «Рефакторинг общего модуля» — агент видит только экспортные методы и их потребителей, не загружая всё тело модуля.
Как подключить Графон к Claude Code
- Скачайте и запустите индексацию выгрузки:
grafon index path/to/config_xml. - Добавьте MCP-сервер в конфиг вашего агента:
{
"mcpServers": {
"grafon": {
"command": "grafon",
"args": ["mcp", "--workspace", "./config_xml"]
}
}
}
- В промпте агента опишите правило: «Перед правкой любого BSL-модуля вызывай
get_context_for_edit. Не предполагай имена методов — только те, что вернул Графон».
После этого агент работает по графу, а не по вероятностям эмбеддингов.
Вывод
Векторные базы данных хороши для документов и чатов, но плохи для исполняемого кода. У кода нет синонимов, зато есть строгий граф зависимостей, который нужно обходить, а не «угадывать по близости». Для 1С это критично: конфигурации слишком велики, чтобы пихать их в контекст, и слишком связаны, чтобы резать на чанки без потерь.
Правильный RAG для 1С — это не RAG. Это GraphRAG плюс MCP-сервер. [Графон](https://grafonbase.ru) ровно это и делает: локально, без облака, с 10-кратной экономией токенов и практически без галлюцинаций.