8 сентября 2026 г.
Почему ИИ-агенты галлюцинируют в конфигурациях 1С и как это исправить?
Почему ИИ-агенты галлюцинируют на кодовой базе 1С
Когда разработчик просит Claude Code, Cursor или Windsurf доработать документ «Приобретение товаров и услуг» в типовой конфигурации, агент не обращается к официальной документации. Он пытается понять проект из файлового контекста. Но полная выгрузка конфигурации ERP, УТ, ЗУП или КА — это гигабайты XML-метаданных и сотни тысяч строк кода на BSL.
В 200k-контекстное окно LLM помещается лишь небольшая часть такой базы. Модель начинает отбрасывать файлы, упрощать структуру, а недостающие данные «додумывает». Именно так рождаются галлюцинации — уверенно сгенерированные методы, документы и модули, которых нет в реальной конфигурации.
// Типичная «фантазия» ИИ-агента без доступа к точным метаданным:
Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "A-001");
В реальной типовой конфигурации такого метода может не быть. Модель собрала его из шаблонов платформы, а не из кода проекта. Результат — неработающий код и потерянное время.
Три корневые причины галлюцинаций
1. XML-метаданные не являются структурой, понятной LLM
Конфигурация 1С — это деревья метаданных, экспортируемые в XML. Внутри XML-файлов нет ответа на вопрос «кто вызывает этот общий модуль и какие методы реально существуют». ИИ-агент видит разрозненные теги, длинные строки свойств и табличных частей.
Модель не способна по XML-файлу понять связность кода. Поэтому она реконструирует архитектуру «по вероятности»: берёт имена из соседних файлов, из неполного кода, из общих знаний о платформе и типовых решениях, которые встречались в тренировочных данных. Для закрытых конфигураций 1С таких данных в обучении практически нет — отсюда уверенные ошибки.
2. Переполнение контекста и «потеря середины»
Даже если частично загрузить в контекст модуль объекта документа, он легко занимает 15–20 тыс. строк. Модуль содержит десятки процедур, а целевая функция похоронена в середине. Исследования LLM показывают: при переполнении контекста модель резко теряет точность на середине входной последовательности.
Из-за этого агент «забывает», что нужная переменная уже объявлена в начале модуля, или начинает выдумывать обработчики событий, которые не подписаны в конфигурации.
// Агент с переполненным контекстом часто пишет так:
Документы.ПоступлениеТоваровУслуг.СоздатьДокумент().Записать();
Проблема в том, что документ в конфигурации называется иначе, а метод СоздатьДокумент() отсутствует. Модель заменяет неизвестное правдоподобной конструкцией — классическая галлюцинация.
3. Отсутствие графа вызовов
Для анализа кода 1С критически важен граф зависимостей. Архитектору или тимлиду не нужно загружать в голову весь общий модуль, чтобы понять, из каких мест вызывается функция. Достаточно посмотреть граф:
- кто вызывает
ОбработкаПроведения - к каким общим модулям обращается эта процедура
- какие подписки на события срабатывают при проведении документа
Без такого графа ИИ-агент использует эвристику. Он ищет вхождение имени процедуры по всем файлам проекта, но теряет контекст из-за большого объёма совпадений. В итоге агент делает ложные выводы: «если процедура называется так же, значит, она от несуществующего интерфейса».
Почему просто «скормить файлы» не работает
Некоторые команды пытаются использовать RAG-подход: разбить XML и модули BSL на чанки, сложить в векторную базу, а затем подставлять в промпт «похожие» куски. Но для архитектуры 1С RAG на тексте неэффективен.
Конфигурация — это связный граф объектов, а не плоская текстовая документация. Разбиение на чанки разрушает цепочку вызовов. ИИ получает обрывки с одинаковыми названиями процедур в разных модулях и не может понять, какой из них относится к задаче.
Нужен инструмент, который понимает семантику конфигурации: метаданные, подписки, права, общие модули, запросы и точки вызова.
Что такое Grafon и как он решает проблему
Grafon — локальный инструмент и MCP-сервер для конфигураций 1С. Он анализирует всю конфигурацию и строит граф зависимостей:
- объекты метаданных
- процедуры и функции модулей
- подписки на события
- вызовы общих модулей
- структуру запросов к базам данных
ИИ-агент через протокол MCP обращается к Grafon и получает только точный срез связанных файлов и сигнатур. В контекст не попадает «весь общий модуль целиком» — только необходимые функции и их вызовы.
Конфигурация 1С (.dt / XML)
↓
Grafon — парсинг метаданных и BSL
↓
граф зависимостей
↓
MCP-сервер (локальный)
↓
Claude Code / Cursor / Windsurf
Пример MCP-запроса к Grafon:
grafon.get_subgraph
{
"node": "Документ.ПриобретениеТоваровУслуг.МодульОбъекта.ОбработкаПроведения",
"depth": 2,
"include": ["callers", "callees", "subscriptions"]
}
В ответ возвращаются не сырые XML-файлы, а структурированные данные: точные сигнатуры, списки вызываемых процедур, обработчики подписок. Агент больше не гадает, существует ли метод. Он работает с верифицированной информацией.
Сравнение подходов: без Графона и с Графоном
Расчётные показатели для сценария «добавить реквизит в документ и реализовать проведение на основании счёта»:
| Параметр | Без Графона (полная загрузка файлов) | С Графоном (MCP-срез) |
|---|---|---|
| Загружено в контекст | 500–700 тыс. токенов | 30–50 тыс. токенов |
| Время выполнения задачи | 8–15 минут, частая деградация | 1–3 минуты |
| Переполнение контекста | критическое | отсутствует |
| Точность сигнатур | 40–60%, угадывание | 95%+, по метаданным |
| Количество галлюцинаций | 3–6 за задачу | почти нулевое |
За счёт графа зависимостей Grafon сокращает потребление токенов до 10 раз. Для команд, которые используют ИИ-ассистентов на коммерческих тарифах или через API, это прямое снижение бюджета.
Практический сценарий для тимлида
Допустим, разработчик работает с документом ПриобретениеТоваровУслуг и хочет добавить логику в проведение.
Без Графона агент пытается найти все упоминания документа по всей конфигурации. Контекст быстро переполняется подписками на события, печатными формами, общими модулями, которые не относятся к делу.
С Графоном запрос выглядит так:
grafon.get_callers
{
"function": "ОбработкаПроведения",
"object": "Документ.ПриобретениеТоваровУслуг"
}
Агент получает цепочку: подписки на событие «Перед записью» → процедура из общего модуля → вызов менеджера документа. Дальше он изменяет только нужный участок кода.
// BSL-код, который агент формирует после получения точного среза:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Графон дал точное имя общего модуля и метода:
ОбщегоНазначения.СообщитьПользователю(
"Проведение выполняется в режиме: " + Строка(РежимПроведения));
// ... логика разработчика
КонецПроцедуры
Когда ИИ-агент перестаёт галлюцинировать
Галлюцинации исчезают, когда модель перестаёт замещать недостающее своей фантазией. Для этого нужно выполнить два условия:
- дать агенту точные имена функций, процедур, объектов метаданных
- ограничить контекст минимально необходимым набором кода
Grafon решает обе задачи. Он физически не передаёт агенту полную конфигурацию. Вместо этого поставляются компактные графовые срезы, которые точно описывают архитектуру в точке изменения. Модель больше не вынуждена «угадывать» API. Она использует те же сигнатуры, которые видят разработчик и компилятор платформы.
Вывод для архитекторов и команд разработки
Галлюцинации ИИ-агентов в конфигурациях 1С — это не недостаток конкретной модели, а следствие неверного формата передачи знаний. Гигабайты XML и сотни тысяч строк BSL не помещаются в контекст, а закрытые типовые конфигурации плохо представлены в обучающих данных LLM.
Чтобы сделать ИИ-ассистента безопасным для производства, нужен архитектурный слой — локальный граф зависимостей, доступный через MCP. Grafon даёт агенту только точные срезы метаданных и кода, исключает переполнение контекста, сокращает расходы на токены и устраняет причину системных галлюцинаций.