Ловля на ИИ: нейро-ревью BSL-кода, где получилось два заключения по одному модулю, что повлекло массу проверок на платформе 1С
Разработка - Рефакторинг и качество кода
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Для разработчиков 1С: ревью подопытного BSL-модуля с проверкой поведения на платформе.
- Модуль с правильным синтаксисом и неправильным поведением
- Что именно получили агенты
- Без контракта хороший ответ заканчивается вопросом
- Ноль превратился в скидку, а входной параметр изменился
- Ответ модели проверила платформа
- Как повторить опыт
- Что сломалось при сборке стенда
- Где заканчивается этот результат
- Материалы к статье
Вначале Конфигуратор принял "подопытный" модуль. Последовавшие проверки поведения нашли деление на ноль, скидку вместо её отсутствия и сортировку, которая испортила исходную таблицу. Для того же кода я получила два заключения от агентов в Codex: одному передали модуль с заданием на ревью, второму добавили договорённости о входах и результатах функций.
Оба агента заметили рискованные места. Разница оказалась в том, что они могли утверждать. Первый спрашивал, допустима ли пустая коллекция и где положено округлять сумму. Второй получил ответы заранее и назвал конкретные нарушения. Ниже весь опыт: код, условия, ответы и проверка на платформе.
Для кого: разработчикам 1С, которые поручают ИИ первичную проверку изменений и затем сами принимают замечания.
Модуль с правильным синтаксисом и неправильным поведением
Я собрала учебный модуль из шести функций: средняя цена, скидка, округление и копирование нарушают заданные условия; сумма загруженных строк и преобразование числа служат контрольными примерами. Данные синтетические; конфигурации заказчиков в опыт не передавались.
| Функция | Договорённость | Что делает исходный код |
|---|---|---|
СредняяЦена |
Пустой массив допустим, результат 0 | Делит сумму на количество элементов |
ПрименитьСкидку |
0 означает отсутствие скидки; только Неопределено заменяется на 10%; аргумент вызывающего кода сохраняется |
Проверяет ЗначениеЗаполнено и присваивает параметру 10 |
СуммаКОплате |
Сначала суммировать произведения, потом округлить итог | Округляет произведение в каждой строке |
СортированнаяКопия |
Вернуть отдельную таблицу; исходный порядок сохранить | Присваивает таблицу другой переменной и сортирует её |
СуммаСтрок |
Сложить числовую колонку загруженной таблицы значений | Читает СтрокаТовара.Сумма внутри цикла |
РазобратьКоличество |
Ошибку преобразования передать вызывающему коду | Вызывает Число(Текст) без локального перехвата |
Последние два участка включены намеренно. По нашему контракту функция читает числовую колонку таблицы значений в памяти. Исключение при неверной строке тоже ожидается: обработка предусмотрена снаружи. Замечания «убрать запрос из цикла» и «везде добавить Попытку» здесь потребовали бы лишней правки.
Что именно получили агенты
В каждом запуске был один и тот же промпт из архива: назвать функцию и выражение, привести условие воспроизведения, последствие и минимальное исправление. Отдельно попросила разделить доказанные дефекты и вопросы к контракту. В промпте также были два ограничения: не считать каждое чтение свойства запросом и не требовать перехвата исключения в каждой функции.
Это существенная часть условий. Отсутствие этих ложных тревог нельзя приписать одной модели: промпт прямо предостерегал от них.
Запуск A получил prompt.md и review-input.bsl. Запуск B получил те же файлы и context.md с договорённостями из таблицы. У агентов были отдельные беседы без истории редакционной работы. Эталон и платформенные проверки им не передавались. Инструкция запрещала читать другие файлы, пользоваться сетью и исполнять код; отдельной файловой песочницы для этого опыта не было.
| Условие | Значение |
|---|---|
| Дата опыта | 09.10.2026 |
| Среда ревью | Агенты в Codex, по одному ответу на вариант |
| Модель | В локальных журналах обеих сессий: gpt-6-astra, уровень рассуждения medium; остальные параметры генерации не зафиксированы |
| Платформенная проверка | 1С:Предприятие 8.3.27.2130, x86, Windows |
| База | Отдельная новая файловая база для каждого варианта кода |
| Исполнение | Общий модуль через внешнее COM-соединение из 32-битного Windows PowerShell |
Точный повтор ответов модели по этим данным не гарантируется. Архив позволяет повторить задания и проверку BSL, сопоставить своё ревью с сохранёнными ответами. Сравнения продуктов, рейтинга моделей и замера экономии времени здесь нет.
Без контракта хороший ответ заканчивается вопросом
В заключении A агент указал деление на ноль для пустой коллекции, но не стал выбирать результат вместо заказчика: вернуть 0 или отклонить вход - зависит от требования. У сортировки он обнаружил отсутствие копирования и отдельно оговорил, что запрет менять оригинал пока следует только из имени функции.
Для скидки агент заметил и подмену нуля, и изменение аргумента. Затем спросил, что означает 0 и допускается ли побочный эффект. Для округления привёл контрпример, но оставил выбор правила за контрактом. Технически это полезные замечания уже на первом проходе.
В заключении B те же места стали доказанными нарушениями. В таблице ответа пять замечаний: четыре функции, причём у скидки отдельно разобраны выбор значения и изменение аргумента. Контрольные функции агент оставил без требования исправления.
| Группа | Ответ A: только код | Ответ B: код с контрактом |
|---|---|---|
| Пустой массив | Показан риск, запрошена реакция на пустоту | Требуется вернуть 0 |
| Нулевая скидка и аргумент | Оба эффекта обнаружены, их допустимость уточняется | Оба эффекта нарушают контракт |
| Округление | Приведён контрпример, задан вопрос о правиле | Требуется округление общего итога |
| Копирование | Отсутствие копии обнаружено; требование пока выведено из имени | Требуется отдельная таблица и сохранение оригинала |
| Две контрольные функции | Без безусловных требований менять код | Соответствуют приложенным условиям |
Считать вопросы первого агента пропусками было бы несправедливо. В этом небольшом опыте явный контракт помог обосновать диагноз и выбрать исправление. Утверждать рост точности в процентах по двум ответам я не могу.
Ноль превратился в скидку, а входной параметр изменился
Вот исходная функция из модуля:
Проверка на платформе передала сумму 100 и переменную Скидка = 0. Функция вернула 90, переменная вызывающего кода стала равна 10. В отдельной проверке с Неопределено результат 90 был верным, но входная переменная тоже менялась на 10, хотя это запрещено контрактом.
Исправленный вариант различает отсутствие значения и числовой ноль. Параметр Знач Скидка позволяет менять локальное значение, сохраняя аргумент вызывающего кода в проверенных сценариях:
Для остальных ошибок правки тоже небольшие. Пустой массив проверяется перед делением. Округление переносится в возврат общего итога. Сортировка работает с результатом Таблица.Скопировать().
Полный исправленный модуль лежит рядом с исходным. Это редакторская реализация исправлений, проверенная на стенде; агенты по заданию предлагали минимальные изменения, целый модуль они не переписывали.
Ответ модели проверила платформа
Оба модуля прошли /CheckModules для сервера и внешнего соединения: «Синтаксических ошибок не обнаружено!». Затем один и тот же проверочный модуль выполнил 14 проверок поведения.
Сохранила журналы этого прогона в архиве, в папке evidence/platform. Полное содержимое input-4.log:
Синтаксических ошибок не обнаружено!
В fixed-4.log записана та же строка. Это результат проверки синтаксиса. Значения функций проверяются следующим запуском через COM.
Результат получает скрипт companion/run_tests.ps1. Его полный текст:
Запустить() возвращает JSON, который PowerShell записывает в файл. Отдельный журнал COM-соединения этот скрипт не ведёт. В проверочном модуле строка D2-zero сравнивает результат скидки с 100, а D2-argument проверяет, осталась ли входная переменная равна 0.
Два объекта из input-results.json, без изменения полей и значений:
Те же проверки в fixed-results.json:
Так видны оба эффекта правки: сумма стала 100, входная скидка осталась 0. Для пустого массива исходный журнал содержит объект:
В исправленном варианте у D1-empty записаны "pass": true и "detail": "0". В этих выдержках показаны отдельные объекты массива; полные JSON-файлы содержат по 14 объектов. Снимки экрана исходного запуска не сохранялись. Выдержки взяты из его файлов результатов.
| Проверка | Исходник | После исправления |
|---|---|---|
| Средняя цена пустого массива | Исключение: деление на 0 | 0 |
| Сумма 100, скидка 0 | 90 | 100 |
| Переменная со скидкой 0 после вызова | 10 | 0 |
Переменная Неопределено после вызова |
10 | Неопределено |
| Две строки по 0.014 × 1 | 0.02 | 0.03 |
| Первая цена оригинала после сортировки копии входа 2, 1 | 1 | 2 |
| Всего пройдено | 8 из 14 | 14 из 14 |
Оставшиеся проверки контролируют обычную среднюю цену, явную и стандартную скидки, порядок результата сортировки, пустую и непустую таблицу сумм, корректное преобразование числа и ожидаемое исключение для неверной строки. Ошибки распределены по четырём функциям, а проваленных проверок шесть: у скидки проверены несколько последствий.
Проверочный модуль считает ожидаемое исключение успешным результатом. Поэтому зелёная строка C2-error означает, что исключение дошло до вызывающего кода.
Как повторить опыт
Распакуйте архив. Для собственного ревью создайте две новые беседы в выбранном ИИ-инструменте. В первую передайте prompt.md и review-input.bsl, во вторую добавьте context.md. Не передавайте эталон, исправленный модуль и результаты до получения ответов. Сохраните точное название модели и параметры, которые показывает ваш инструмент.
Для проверки кода нужны установленная платформа 1С x86 с доступным COMConnector и Python 3. В моём прогоне использовался Python 3.12; зависимости Python сверх стандартной библиотеки сборщику не нужны. Из папки companion запустите:
python build_stand.py --variant input --output ../my-run/input python build_stand.py --variant fixed --output ../my-run/fixed
Путь к платформе можно передать параметром --platform. Сборщик создаёт новую базу в системной временной папке при каждом запуске. Существующие базы не удаляет. Для каждой базы он выгружает пустую конфигурацию, добавляет модули, загружает изменения, проверяет синтаксис и вызывает проверки через COM. В файлах input-results.json и fixed-results.json сохраняются результаты отдельных проверок. false в исходном варианте ожидается: это проверка обнаруживаемых дефектов.
Перед повторным запуском выберите новую папку --output, если нужно сохранить прежние журналы. Базы остаются во временной папке для изучения; их пути выводятся сборщиком после успешного прогона.
Что сломалось при сборке стенда
| Симптом | Причина в этом прогоне | Что исправлено |
|---|---|---|
| Платформа отклоняет строку подключения | В аргументе CREATEINFOBASE использован неподходящий для этого запуска формат кавычек |
Применён формат File=путь из работающего сборщика проекта |
Сборщик не находит пустой ChildObjects |
Новая конфигурация уже содержит язык Русский | Добавление модулей сохраняет существующий узел языка |
PowerShell отказывается читать .ps1 |
Политика исполнения локальной среды | Вызов использует -ExecutionPolicy Bypass для дочернего процесса; политика системы не меняется |
Кириллица в .ps1 превращается в нечитаемые символы |
Windows PowerShell прочитал UTF-8 без BOM в другой кодировке | Скрипт сохранён в UTF-8 с BOM |
| Общий модуль через свойство COM даёт пустое значение | Прямое обращение из PowerShell не получило модуль | Модуль запрашивается через InvokeMember с GetProperty |
Последняя таблица относится к моему окружению. Политики организации могут запрещать такой запуск PowerShell; тогда согласуйте штатный способ исполнения с администратором.
Где заканчивается этот результат
Набор маленький и специально составлен для опыта. Он не проверяет ревью крупных конфигураций, блокировки, права, проведение, динамические вызовы и конкурентный доступ. Проверки выполнены в файловой базе через COM; клиент-серверный вариант и тонкий клиент не запускались. Время работы не измерялось.
Контракт и ожидаемые результаты составлены при подготовке этой статьи. Ответы агентов получены отдельно, но внешней независимой разметки здесь нет. Исходные ответы сохранены целиком, чтобы читатель мог проверить мою интерпретацию.
Для своего проекта я бы перенесла из этого опыта порядок работы: передать код вместе с договорённостями, потребовать воспроизводимый пример для замечания, проверить его и лишь затем принять правку. Общий список «плохих практик» не скажет, где ваш договор требует округление и кто обязан обработать исключение.
Какое замечание ИИ в вашем ревью оказалось верным только после уточнения контракта функции? Особенно интересны примеры, где первоначально предложенная правка меняла правильное поведение.
Материалы к статье
В архиве: исходный и исправленный BSL, контракт, промпт, оба ответа агентов, протокол с эталоном, сборщик базы, проверочный модуль и результаты выполнения. Имена файлов и команды выше относятся к этому комплекту.
По смежной теме у Ninel_S: поиск запросов в циклах по графу вызовов. В текущем опыте проверяется другой вопрос: какие сведения нужны агенту, чтобы обосновать замечание о поведении функции.
Ninel_S · Учебный опыт на 1С:Предприятии 8.3.27.2130 · 09.10.2026
Вступайте в нашу телеграмм-группу Инфостарт