1С-код от нейросети: как тестировать то, что сгенерировал ИИ
Генерация кода нейросетями перестала быть экзотикой — ChatGPT, Claude и специализированные модели пишут на 1С всё чаще. Но есть нюанс: код, который выглядит «как надо», может содержать логические ловушки, невидимые при беглом просмотре. Мы разберём, как тестировать такой код не «на глаз», а системно, используя инструменты платформы, которые обычно лежат мёртвым грузом в конфигурации.
Почему «красивый» код ИИ — это ловушка
Нейросеть отлично генерирует синтаксически правильный код. Она знает, что после Если нужно Тогда, а после Попытка — Исключение. Проблема в другом: ИИ не понимает семантику предметной области и контекст выполнения. Типичный сценарий: разработчик просит «написать обработку закрытия месяца для БП 3.0», получает красивый код с циклами по документам, но не замечает, что нейросеть использовала Документы.ЗакрытиеМесяца.СоздатьДокумент() — а такого документа в типовой конфигурации нет, это регламентная операция.
Ключевой тезис: Нейросеть не ошибается в синтаксисе — она ошибается в логике бизнес-процессов и архитектуре платформы. Тестировать нужно не «компилируется ли», а «работает ли это в реальной конфигурации с реальными данными».
Технический разбор: что именно упускает ИИ
Рассмотрим типовую задачу: получить остатки по регистру на дату. Нейросеть часто генерирует такой код:
// НЕПРАВИЛЬНО: нейросеть забывает про периодичность
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Количество Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Запрос.УстановитьПараметр("Склад", СсылкаНаСклад);
Результат = Запрос.Выполнить();
На первый взгляд — рабочий код. Но он упадёт, если регистр ТоварыНаСкладах не имеет периодичности «Остатки» (например, это регистр оборотов). Или если Склад — необязательное измерение, а нейросеть жёстко его зафиксировала. Настоящая проблема: ИИ не проверяет метаданные конфигурации.
// ПРАВИЛЬНО: с проверкой через Метаданные
МетаРегистра = Метаданные.РегистрыНакопления.ТоварыНаСкладах;
Если МетаРегистра.Периодичность = ПериодичностьРегистраНакопления.Остатки Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Количество Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК Остатки
|ГДЕ
| Остатки.Склад = &Склад";
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Запрос.УстановитьПараметр("Склад", СсылкаНаСклад);
Результат = Запрос.Выполнить();
Иначе
Сообщить("Регистр не поддерживает остатки, используйте обороты");
КонецЕсли;
Методика тестирования: три уровня проверки
Мы предлагаем не доверять коду ИИ, а пропускать его через три фильтра. Первый — синтаксический (его делает платформа), второй — логический (его делает разработчик), третий — нагрузочный (его делает среда).
Уровень 1: Статический анализ через встроенные средства
Платформа 1С предоставляет мощный инструмент — Проверка конфигурации (меню «Конфигурация» → «Проверка»). Но нейросетевой код часто проходит эту проверку, потому что он синтаксически корректен. Нужно включить расширенные проверки:
- Проверка ссылочной целостности — ИИ может использовать
НайтиПоНаименованиюдля элемента, которого нет в демо-базе. - Проверка неиспользуемых переменных — нейросеть часто генерирует «мусорные» переменные, которые не влияют на результат, но засоряют код.
- Проверка производительности — встроенный анализатор покажет запросы без индексов.
Предупреждение: Никогда не запускайте сгенерированный ИИ код в рабочей базе без предварительного прогона в отладчике с точками останова на каждом
Записать()иВыполнить(). Один неверный реквизит — и вы получите блокировку таблиц на 15 минут.
Уровень 2: Модульное тестирование через обработку «Тестирование»
В 1С есть штатная обработка «Тестирование и исправление ИБ», но для кода ИИ лучше написать свою обёртку. Пример минимального теста для проверки сгенерированной функции:
// Обработка.ТестГенерации.Форма.Форма
Процедура ТестПроверкиОстатков(Команда)
// Подготовка тестовых данных
ТестовыйСклад = Справочники.Склады.НайтиПоНаименованию("Основной");
Если ТестовыйСклад = Справочники.Склады.Пустая() Тогда
ТестовыйСклад = Справочники.Склады.СоздатьЭлемент();
ТестовыйСклад.Наименование = "ТестовыйСклад_ДляИИ";
ТестовыйСклад.Записать();
КонецЕсли;
// Вызов тестируемого кода (сгенерирован нейросетью)
Попытка
Результат = ВычислитьОстаткиПоСкладу(ТестовыйСклад, ТекущаяДата());
Если Результат.Количество() = 0 Тогда
ЗаписьЖурналаРегистрации("ТестИИ", УровеньЖурналаРегистрации.Информация,,,
"Тест пройден: остатки пусты, как и ожидалось");
Иначе
// Дополнительная проверка: тип результата
Для Каждого Строка Из Результат Цикл
Если Не ЗначениеЗаполнено(Строка.Номенклатура) Тогда
Сообщить("Ошибка: пустая номенклатура в остатках");
Возврат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ТестИИ", УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Практическое руководство: чек-лист для внедрения кода ИИ
На основе опыта внедрения нейросетевых генераций в нескольких проектах мы составили список обязательных проверок. Не пропускайте ни один пункт.
- Проверка метаданных: откройте «Метаданные» в конфигураторе и убедитесь, что все объекты (документы, справочники, регистры), которые использует код, существуют в вашей конфигурации. ИИ часто выдумывает имена.
- Проверка прав доступа: сгенерированный код может использовать
ПолучитьСсылкуилиНайтиПоКодудля объектов, к которым у пользователя нет прав. Прогоните код под учётной записью с минимальными правами. - Проверка на рекурсию: нейросети любят генерировать рекурсивные вызовы обработчиков. Вставьте счётчик вызовов в начало процедуры и ограничьте глубину.
- Проверка на «забытые» транзакции: если код содержит
НачатьТранзакцию(), убедитесь, что естьЗафиксироватьТранзакцию()илиОтменитьТранзакцию()в блокеИсключение. - Проверка на работу с внешними ресурсами: если код использует
HTTPСоединениеилиЧтениеJSON, проверьте таймауты и обработку ошибок соединения.
Типичные ошибки при тестировании кода ИИ
| Ошибка | Как проявляется | Решение |
|---|---|---|
| Использование несуществующего реквизита | Ошибка «Поле не найдено» при выполнении запроса | Проверять через Метаданные.Реквизиты перед использованием |
| Некорректный тип параметра | Ошибка «Несоответствие типов» при передаче в запрос | Явно преобразовывать типы через Строка(Значение) или Число(Значение) |
| Отсутствие обработки исключений | Аварийное завершение при ошибке | Обернуть весь сгенерированный код в Попытка...Исключение |
| Генерация «вечного» цикла | Зависание платформы | Установить лимит итераций через СчетчикЦикла > 1000 |
Что делать прямо сейчас
Не ждите, пока код ИИ «упадёт» в рабочей базе. Выполните три шага:
- Создайте отдельную тестовую базу — копию конфигурации, где можно безопасно запускать сгенерированный код. Настройте её так, чтобы она была изолирована от обмена с другими системами.
- Напишите универсальную обработку-тестировщик, которая принимает текст модуля и выполняет его в контексте текущей конфигурации, логируя все ошибки и время выполнения. Примерный каркас мы привели выше.
- Внедрите правило code-review: любой код, сгенерированный ИИ, должен быть проверен как минимум двумя разработчиками. Один проверяет логику, второй — производительность.
Итоговый совет: Нейросеть — это мощный инструмент для черновиков, но не для финального кода. Относитесь к сгенерированному коду как к коду стажёра: он может быть быстрым, но требует тщательной проверки. Используйте встроенные средства платформы для автоматизации этой проверки, и вы сэкономите часы отладки.
Попробовать НОПик →