Субагенты на дешёвой модели: как проверять цитаты BSL и отсекать галлюцинации
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Ситуация: выгрузка конфигурации 1С занимает сотни мегабайт. Читать её целиком дорогой моделью накладно, поэтому сбор цитат и имён процедур поручают дешёвым субагентам. Они иногда придумывают процедуры, которых нет, и «улучшают» цитаты. Проверять каждую ссылку глазами долго, а цитата, похожая на правду, пройдёт незамеченной.
О чём это (в трёх тезисах):
- Скрипт quote_fact_checker.py сверяет отчёт субагента с выгрузкой BSL: есть ли файл, есть ли процедура, совпадает ли флаг Экспорт, входит ли цитата в тело метода, не уехали ли номера строк.
- Четыре типичных дефекта (выдуманная процедура, искажённая цитата, подмена видимости, дрейф строк) на тестовом модуле отловлены; при отказе скрипт печатает unified diff и возвращает код 1.
- Семь автотестов проходят из распакованного архива за 0,57 с; экономию на токенах и скорость конвейера я не замеряла.
Отчёт о тестировании файла-компаньона:
17.10.2026, Windows 11 Pro, Python 3.12.7, запуск из распакованного архива subagent-quote-checker-companion.zip (15 КБ: quote_fact_checker.py, test_quote_checker.py, fixtures/, README.md) во временном каталоге. Команда: python -X utf8 -m unittest test_quote_checker.py -v. Результат: 7 тестов, ошибок нет, 0,57 с. Не проверялось: работа с реальной выгрузкой конфигурации, модули в формате EDT, нагрузка.
Суть статьи:
Дешёвая модель собирает цитаты, детерминированный скрипт без участия модели проверяет их по файлам выгрузки. Скрипт подтверждает, что цитата и процедура существуют и совпадают с исходником. Верны ли выводы по этой цитате, он не оценивает: это остаётся за человеком.
Для кого: разработчики 1С и тимлиды, которые поручают ИИ-субагентам первичный разбор выгрузок и хотят автоматически отсекать выдуманные процедуры и искажённые цитаты.
Субагент возвращает отчёт: модуль, имя процедуры, номера строк, дословная цитата. Верить ему на слово нельзя, а сверять цитаты руками дольше, чем найти их в файле. Скрипт делает эту сверку за полсекунды без обращения к модели. Дальше по порядку: как разделены роли, как устроен разбор BSL, что скрипт ловит и чего не умеет.
Роли в связке моделей
Дорогая рассуждающая модель ставит задачи и строит гипотезы. Дешёвые субагенты параллельно читают модули и собирают факты. Между ними стоит скрипт сверки, у которого нет модели внутри.
| Этап | Участник | Что делает |
|---|---|---|
| 1 | Ведущая модель | Ставит задачи, проектирует доработку, выдвигает гипотезы |
| 2 | Дешёвые субагенты | Ищут методы в CommonModules, собирают цитаты, пишут отчёт в JSON |
| 3 | Скрипт quote_fact_checker.py |
Проверяет файл, сигнатуру, флаг Экспорт, цитату и номера строк; локальный Python, без LLM |
| 4 | Человек | Принимает только то, что прошло сверку, и решает, что внедрять |
Если отчёт получил REJECT, его возвращают субагенту с текстом отказа, а человеку он не попадает. Сколько это экономит денег, я не считала: цена зависит от выбранных моделей и объёма выгрузки.

Стенд проверки
| Компонент | Версия | Назначение |
|---|---|---|
| Операционная система | Windows 11 Pro, 64 бита | Запуск скрипта и тестов |
| Python | 3.12.7 | Среда скрипта и автотестов |
| Платформа 1С | 8.3.27.2130 | Версия, на которую рассчитан формат выгрузки; в автотестах не участвует |
| Формат исходников | XML/BSL, каталог CommonModules |
Выгрузка модулей |
| Тесты | unittest из стандартной библиотеки |
Модульные тесты и проверка автономности архива |
Тестовый общий модуль РаботаСЗаказамиСервер.bsl с экспортными методами проверки, блокировки и служебными процедурами лежит в архиве, поэтому для запуска тестов платформа не нужна.
Как устроен разбор BSL
Чтобы проверить утверждение субагента, скрипт строит облегчённый индекс модуля без внешних парсеров. Для каждой процедуры или функции он запоминает:
- вид:
ПроцедураилиФункция; - директиву компиляции:
&НаСервере,&НаКлиенте,&НаСервереБезКонтекста; - видимость: есть ли ключевое слово
Экспорт.
Класс BslModuleIndex разбирает файл построчно; кодировки UTF-8, UTF-8 с BOM и Windows-1251. Заголовок метода ищет регулярное выражение:
Каждый найденный метод хранится как BslMethod: диапазон строк line_start и line_end, параметры и список строк тела. По этой структуре сразу видно, есть ли метод в модуле и можно ли вызвать его снаружи.
Сверка цитат
Субагент отдаёт утверждения в структурированном виде: модуль, символ, флаг экспорта, строки и дословная цитата.
Скрипт проходит по цепочке:
- Есть ли файл модуля в каталоге выгрузки.
- Есть ли символ
symbolв индексе. - Совпадает ли
is_export. Если метод внутренний, а субагент назвал его экспортным, статусEXPORT_FLAG_MISMATCH. - Входит ли нормализованная цитата в тело метода. Пробелы и табуляции приводятся к одному виду, поэтому разные отступы проверку не ломают.
Запуск на корректном отчёте:

[PASS] EXACT_MATCH CLM-BSL-001: РаботаСЗаказамиСервер.ПроверитьЗаполнениеЗаказа Детали: Цитата верифицирована в теле метода 'ПроверитьЗаполнениеЗаказа' (EXACT_MATCH). [PASS] EXACT_MATCH CLM-BSL-002: РаботаСЗаказамиСервер.РассчитатьИтогиЗаказа Детали: Цитата верифицирована в теле метода 'РассчитатьИтогиЗаказа' (EXACT_MATCH). [PASS] EXACT_MATCH CLM-BSL-003: РаботаСЗаказамиСервер.ЗаблокироватьЗаказДляОбработки Детали: Цитата верифицирована в теле метода 'ЗаблокироватьЗаказДляОбработки' (EXACT_MATCH). ИТОГ: Всего утверждений: 3 | Подтверждено: 3 | Отклонено: 0 РЕШЕНИЕ ГЕЙТА ФАКТОВ: PASS (Все факты и цитаты подтверждены)
Какие галлюцинации скрипт ловит
Опаснее всего искажения, которые меняют смысл BSL, но выглядят правдоподобно. В эксперименте на тестовом модуле я собрала четыре типичных дефекта:
- Выдуманный метод: субагент заявил экспортную процедуру
ПересчитатьСкидкиВДокументе, в модуле её нет. - Мутация условия: в проверке
Если Не ЗначениеЗаполнено(...) И Не Отказ Тогдасубагент потерялИ Не Отказ. Такой фрагмент, перенесённый в код, затрёт предыдущие ошибки проведения. - Подмена видимости: внутренняя процедура
ЗаписатьЛогИзмененияСтатусаназвана экспортной. - Дрейф строк: номера строк смещены на 134 позиции относительно файла.
Запуск на отчёте с этими дефектами:

[FAIL] HALLUCINATED_SYMBOL CLM-HALLUC-001: РаботаСЗаказамиСервер.ПересчитатьСкидкиВДокументе
Детали: Галлюцинация субагента: метод отсутствует в модуле 'РаботаСЗаказамиСервер'.
[FAIL] MUTATED_QUOTE CLM-MUTATE-002: РаботаСЗаказамиСервер.ПроверитьЗаполнениеЗаказа
Детали: Искажение цитаты субагентом: приведённый код не совпадает с реальным телом метода.
Различия (unified diff):
--- Субагент (цитата)
+++ Исходник 1C BSL
@@ -1,4 +1,9 @@
-Если Не ЗначениеЗаполнено(ЗаказКлиента.Контрагент) Тогда
-ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нет контрагента!");
+Если Не ЗначениеЗаполнено(ЗаказКлиента.Контрагент) И Не Отказ Тогда
+ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
+НСтр("ru = 'В заказе клиента не указан контрагент!'"),
+ЗаказКлиента,
+"Контрагент",
+"Объект"
+);
Отказ = Истина;
[FAIL] EXPORT_FLAG_MISMATCH CLM-FLAG-003: РаботаСЗаказамиСервер.ЗаписатьЛогИзмененияСтатуса
Детали: Искажение сигнатуры: метод заявлен как Экспорт, но объявлен как Внутренний.
[FAIL] LINE_DRIFT CLM-DRIFT-004: РаботаСЗаказамиСервер.РассчитатьИтогиЗаказа
Детали: Смещение строк: агент указал строки 180..195, реальный метод на 46..58 (дрейф 134 строк).
РЕШЕНИЕ ГЕЙТА ФАКТОВ: REJECT (Обнаружены галлюцинации или искажения!)
Скрипт завершается кодом 1, поэтому его можно поставить шагом в CI или в конвейер подготовки отчётов.
Автотесты
Архив должен запускаться сам: распаковать в каталог вне репозитория и выполнить стандартным unittest. Набор test_quote_checker.py состоит из семи тестов:
- разбор конструкций BSL;
- успешная сверка эталонного отчёта;
- выдуманный символ;
- diff искажённой цитаты;
- флаг
Экспорт; - дрейф строк;
- создание ZIP, распаковка во временный каталог и запуск через
subprocess.run.

test_01_parse_bsl_module_symbols ... ok test_02_valid_report_passes_gate ... ok test_03_detect_hallucinated_symbol ... ok test_04_detect_mutated_quote_with_diff ... ok test_05_detect_export_flag_mismatch ... ok test_06_detect_line_drift ... ok test_07_unpack_archive_and_standalone_run ... ok ---------------------------------------------------------------------- Ran 7 tests in 0.570s OK
Диагностика отказов
Если скрипт вернул REJECT на вашем отчёте, сверьтесь с таблицей. Причины в среднем столбце вероятные, их нужно проверять по конкретному отчёту.
| Статус | Вероятная причина | Что сделать |
|---|---|---|
MODULE_NOT_FOUND |
Субагент сократил имя общего модуля или ошибся в префиксе подсистемы | Передать в промпт точный список каталогов из CommonModules |
HALLUCINATED_SYMBOL |
Модель назвала метод по аналогии с типовой конфигурацией | Потребовать цитировать только процедуры из исходника |
MUTATED_QUOTE |
Модель перефразировала код или заменила кавычки и операторы | Поставить temperature=0 и запретить форматирование цитат |
LINE_DRIFT |
Выгрузка обновилась, либо агент читал старый файл | Обновить выгрузку DumpConfigToFiles и повторить сбор |
EXPORT_FLAG_MISMATCH |
Модель решила, что вспомогательную процедуру можно вызвать снаружи | Проверить объявление; добавить Экспорт, если вызов нужен |
Ограничения
- Регулярные выражения вместо компилятора BSL. Парсер рассчитан на обычное оформление исходников: директива компиляции на отдельной строке, стандартные ключевые слова. Вложенные процедуры внутри препроцессорных блоков
#Если ... #Тогдатребуют предварительной нормализации. - Формат выгрузки. Нужна иерархия каталогов выгрузки Конфигуратора или 1C:EDT (
CommonModules,DataProcessors,Documents). - Кодировки. Поддерживаются UTF-8, UTF-8 с BOM и Windows-1251, остальные нужно перекодировать.
- Смысл цитаты. Скрипт проверяет, что код есть в файле. Верен ли вывод, который субагент сделал по этому коду, он не знает.
- Не проверялось: реальная выгрузка конфигурации в сотни мегабайт, время сверки на ней, влияние на расход токенов.
Источники
- Документация 1С:ИТС: выгрузка конфигурации в файлы и параметры командной строки Конфигуратора.
- Синтакс-помощник платформы 1С:Предприятие 8.3: директивы компиляции и модули.
- Модуль difflib - документация Python 3.12.
- Предшественники на Infostart: разборы статического анализа BSL через BSL Language Server и SonarQube. Здесь решается узкая задача: сверить цитаты субагента с файлом, не разворачивая сервер анализа.
Файл к статье
В архиве subagent-quote-checker-companion.zip:
quote_fact_checker.py: скрипт сверки;test_quote_checker.py: семь автотестов;- тестовый общий модуль
РаботаСЗаказамиСервер.bsl; - примеры отчётов субагента, корректный и с дефектами (
fixtures/); README.mdс запуском и подключением к конвейеру.
Архив лежит в блоке файлов публикации.
Итог
Дешёвые субагенты годятся для первичного разбора больших выгрузок, если их отчёты проходят машинную сверку. Скрипт отловил на тестовом модуле выдуманную процедуру, потерянное условие, неверный флаг Экспорт и дрейф строк на 134 позиции; семь автотестов прошли за 0,57 с. Скрипт проверяет цитаты и имена, а выводы по ним и экономию на токенах нужно оценивать отдельно, на вашей выгрузке.
Вступайте в нашу телеграмм-группу Инфостарт