Я пишу на 1С девятнадцатый год. Застал семёрку, переход на восьмёрку, управляемые формы и три волны «1С скоро умрёт». На Инфостарте с 2007 года, и мои первые публикации — это честные «сделал для себя, пользуйтесь на здоровье»: загрузка номенклатуры из Excel в одну колонку, перепроведение документов со списком видов прямо в коде, автосборки, которые не видели резервов. Они до сих пор продаются и до сих пор собирают вопросы в комментариях: «а на новом релизе заработает?»
К ИИ-помощникам я относился как к очередному пылесосу, который обещают продать вместе с домработницей. Видел ролики, где нейросеть за минуту пишет «обработку загрузки», и видел, что потом с этой обработкой делает первая же реальная база. Код, который выглядит правильно, — самый дорогой код: он проходит мимо глаз и падает у покупателя.
Потом за сорок семь дней я довёл до выпуска вторую версию коммерческого расширения: 784 коммита, 35 тысяч строк кода, 130 автоматических тестов, три типовые конфигурации. Писали его ИИ-агенты. Я решал, что писать, и проверял. Эта статья не о том, какой ИИ молодец. Она о том, как он врёт, и что с этим делать, если вам нужен продукт, а не демонстрация на конференции.


Что именно мы сделали
Расширение «Путевые листы» для 1С:Бухгалтерии 3.0, 1С:УНФ 3.0 и 1С:Управления торговлей 11.5. Путевые листы по приказу Минтранса № 390, восемь бланков, расход топлива по нормам АМ-23-р, электронные транспортные накладные и путевые листы — в том числе документами самой 1С. Продукт продаётся, прошёл модерацию, у него есть покупатели. Это важно: всё, что ниже, проверено не на «Hello, world», а на коде, за который платят деньги.
Команда такая:
- Я — решаю, что делаем, принимаю результат, смотрю на экран глазами.
- Claude Code — основной агент: пишет код, тесты и документацию, гоняет сборку и проверки, ведёт журнал граблей.
- Codex — ИИ другой компании, ревизор. Ему дают готовое и просят найти, где первый соврал. Ещё он рисует картинки — по строгому техзаданию, плоско и без «нейросетевого» блеска.
Схема «один пишет, другой проверяет» появилась не из теории. Сначала Codex тоже писал — справку для пользователя. Написал бодро, отчитался «сверено с формами». Не сверял. С того дня пишет один, а второй ищет, где первый соврал, — и находит.
Семь раз, когда ИИ ошибся — и что его поймало
| Что случилось | Чем опасно | Что поймало |
|---|---|---|
| ИИ написал справку F1. В пяти файлах из семи — выдуманные подписи и «красный индикатор», которого в программе нет. Хотя в задании прямо было: не выдумывать. | Пользователь ищет кнопку, которой нет, и пишет в поддержку, что продукт сломан. | Отдельный агент-сверщик: каждую подпись из справки ищет в формах продукта. Теперь это автоматический аудит. |
| Тест проверял, что колонка таблицы пересчитывает деньги. Он искал в модуле процедуру с нужным именем — и находил. Тест был зелёным. А к колонке обработчик подключён не был. | Пользователь меняет тип кузова — сумма не пересчитывается. Тест при этом «зелёный» месяцами. | Правило «новая проверка обязана хоть раз покраснеть»: ломаем в продукте то, что проверка стережёт, и смотрим, увидит ли она. |
| Настройку начальной страницы код писал в хранилище под одним ключом, а платформа читает под другим. Тест читал тем же ключом, каким код писал, — и был доволен. | Покупатель входит в программу и видит пустой экран. | Снимок первого экрана настоящим клиентом, а не проверка кода кодом. |
| Перенос данных из прежней версии молча стирал перечисления: вид перевозки, вид сообщения. Присваивание было обёрнуто в «Попытку», «чтобы один реквизит не уронил весь перенос». | Теряются обязательные по приказу № 390 сведения, и никто об этом не узнаёт. | Метод деления: заполнить базу, запустить один тест, пересчитать. Виноватым оказался сам продукт. |
| Два элемента формы получили одинаковый внутренний номер. Форма показывала в поле «Вид перевозки» чужое значение: на экране «Коммерческая перевозка», в базе — пусто. | Форма врёт, и по экрану это не заметить. | Аудит номеров элементов форм: ожидается ноль совпадений. |
| Агент уверенно включил привилегированный режим, чтобы рядовой сотрудник мог записать служебные данные. В расширении этот режим у сотрудника просто не включается. У администратора всё работало. | Кнопка работает у разработчика и падает у первого же диспетчера. | Тест под живым пользователем с урезанными правами, в отдельном процессе. |
| Текст для видеообзора. Ревизор сверил каждую фразу диктора с кодом и нашёл шесть преувеличений: «QR-код на бланках» (его там нет), «все бланки Госкомстата» (не все), «из чего сложился каждый литр» (норма, а не литр). | Покупатель видит в ролике обещание, которого в продукте нет. Потом — возврат и плохой отзыв. | Второй ИИ, которому поручено не хвалить, а опровергать. |
Заметили общее? Ни одну из этих ошибок не поймал бы «ещё один прогон тестов». Их ловило другое: другой способ посмотреть на то же самое.
Два кейса под микроскопом — с настоящим кодом
Кейс 1. Тест, который не мог покраснеть. Пользователь правит километры в строке рейса — цена и литры должны пересчитаться сразу. Тест, который это «проверял», выглядел так:
for колонка in ВЛИЯЮТ:
кусок = re.search(r"Процедура %sПриИзменении\(.*?КонецПроцедуры" % колонка, модуль, re.S)
if not кусок or "ПересчитатьСтоимостиНаСервере()" not in кусок.group(0):
без_пересчёта.append(колонка)
Он ищет в модуле формы процедуру с правильным именем и в ней — вызов пересчёта. Процедура «ТипКузоваПриИзменении» была. Пересчёт в ней был. Тест зелёный. Только в разметке формы колонка «Тип кузова» ни к какой процедуре привязана не была — пользователь менял кузов, а сумма стояла. Исправленный тест читает не модуль, а живую связь:
блок = блок_колонки(разметка, колонка) # колонка в Form.xml
обработчик = re.search(r'<Event name="OnChange">(\w+)</Event>', блок)
if not обработчик:
без_пересчёта.append(колонка + ": обработчик не привязан")
Первый же запуск честного теста нашёл вторую такую колонку — «Контейнер». Мораль для тех, кто пишет тесты с ИИ: спросите себя, что тест проверяет — связь или имя. ИИ очень любит проверять имя.
Кейс 2. Одна строка, которая стирала сведения по закону. Перенос данных из прежней версии расширения писал в файл значение перечисления так:
Возврат Элемент.Имя; // было: «КоммерческаяГрузовая»
Возврат Мета.Имя + "." + Элемент.Имя; // стало: «ПЛ_ВидыПеревозки.КоммерческаяГрузовая»
Загрузка ждала полное имя, короткое не узнавала и возвращала «Неопределено». А присваивание было обёрнуто в «Попытку — Исключение» — «чтобы один несовместимый реквизит не уронил весь перенос». В итоге вид перевозки и вид сообщения, обязательные по приказу № 390, у клиента молча становились пустыми. Нашлось это не тестом, а методом деления: заполнить демо-базу, запустить один тест, пересчитать. Виновником оказался не тест, а сам продукт. Совет для 1С-ника: «Попытка», которая глотает исключение без записи в журнал, — это место, где ИИ прячет свои ошибки от вас.
Главное правило: проверка обязана хоть раз покраснеть
ИИ пишет тесты охотно и быстро. Они проходят. Это и есть ловушка: зелёный прогон доказывает не то, что продукт работает, а то, что проверка умеет запускаться.
Я насчитал пять способов написать тест, который не может покраснеть никогда:
- ищет имя, а не связь (процедура есть — значит, работает);
- не может покраснеть в принципе (условие всегда истинно);
- подтверждает сам себя (читает тем же ключом, каким записал);
- молча пропускается, когда проверять нечего;
- считает ожидаемое той же формулой, что и продукт.
Лечится одним приёмом, который теперь обязателен для каждой новой проверки: сломать в продукте ровно то, что она стережёт, и убедиться, что она покраснела. Потом вернуть. Если не покраснела — это не проверка, а декорация.
Как это выглядит вживую — проверка прав в ролях. Сначала зелёная; потом мы подложили подсистеме право «интерактивное удаление», которого у подсистем не бывает:
$ python проверка_ролей.py # как есть ПЛ_ОсновнаяРоль ok ПолныеПрава ok недопустимых прав в ролях: 0 $ python проверка_ролей.py # подложили недопустимое право ПЛ_ОсновнаяРоль ошибок: 1 [ERROR] Subsystem.ПЛ_ПутевыеЛисты.Subsystem.ПЛ_Отчеты: право 'InteractiveDelete' недопустимо для вида 'Subsystem' (допустимо: View) недопустимых прав в ролях: 1
Покраснела — значит, ей можно верить. Роль вернули, проверка снова зелёная.
Конвейер: почему это вообще успевается
ИИ быстрый, но 1С медленная. Если каждая правка — это «открыть конфигуратор, загрузить, обновить, запустить», агент будет стоять больше, чем думать. Поэтому половина работы ушла не в продукт, а в дорогу к нему:
- Сборка за 20 секунд вместо 75. Главный тормоз оказался не в компиляции, а в запуске конфигуратора: шесть секунд на каждый пакетный запуск. Грузим только изменённые файлы, проверку модулей — отдельным запуском.
- Ядро тестов — за полторы минуты вместо пятнадцати. Каждое подключение к серверной базе через COM стоило 4–9 секунд, тестов было восемьдесят. Теперь все тесты работают в одном сеансе.
- Интерфейс смотрим в браузере. База опубликована на локальном веб-сервере, агент открывает формы, жмёт кнопки и делает снимки сам — без тонкого клиента на моём мониторе.
- Три типовые конфигурации — одной командой. Перед выпуском расширение само заливается в БП, УНФ и УТ и прогоняет там свои тесты, в том числе в безопасном режиме.

Так выглядит конец обычного прогона ядра — не для статьи подобранный, а сегодняшний, во время её написания:
$ python run_tests.py Время: 1.6 мин всего. Самые долгие: com_test_токен_закрыт.py 7.8 с com_test_печать_бланков.py 5.3 с com_test_бот2.py 4.6 с Прогон целиком: 1.7 мин при норме 3 мин ИТОГ: Пройдено: 125, Упало: 0, Пропущено: 1 Пропущены (проверять было нечем): com_test_роль.py
Обратите внимание на последнюю строку: тест, которому нечего проверять, не притворяется зелёным, а честно пишет «пропущен». Это тоже урок: против четвёртого способа вечнозелёной проверки из списка выше.
Память, которой у ИИ нет
У агента нет памяти между сессиями. Утром он не помнит, на какие грабли наступил вчера, и с тем же энтузиазмом наступает снова. Я видел, как он дважды за день написал в запросе псевдоним «КАК В» — зарезервированное слово языка запросов, из-за которого запрос падает только при выполнении, иногда через полчаса долгой выгрузки.
Лечится это не уговорами, а файлами:
- Правила проекта — один файл, который агент обязан прочитать первым: где рабочая база, как собирать, чего нельзя. Туда попадает каждый урок, который стоил времени.
- Общая база знаний по 1С — отдельный репозиторий для всех проектов: стенд, скрипты, грабли платформы. Агент нового проекта начинает с неё и не открывает Америку второй раз.
- Проверки вместо обещаний. Урок, который можно проверить автоматически, становится проверкой. Про «КАК В» теперь не надо помнить: тексты запросов разбираются платформой по метаданным живой базы до выполнения, а самотест подсовывает три заведомо неверных запроса и требует три ошибки.

Со временем в проекте накопилось больше сотни таких проверок. Статические идут секунды, их агент гоняет после каждой правки. Выходит не «ИИ стал умнее», а «глупость стала дороже»: каждая повторная ошибка теперь краснеет раньше, чем доходит до меня.
Как устроена связка агентов — для тех, кто строит своих
- Один пишет, другой опровергает. Ревизору ставится задача не «проверь», а «найди, где соврали, и не выдумывай». Отдаёт таблицу: утверждение — подтверждено / не подтверждено / преувеличено — где в коде — как исправить. Так он нашёл шесть преувеличений в тексте нашего видеообзора.
- Несколько сессий — несколько проектов. Параллельно идут отдельные сессии на каждый продукт. Одна главная читает их журналы, сверяет с планом и шлёт поправки сообщением. План и правила каждой сессии лежат в её репозитории, поэтому сессия, открытая завтра с нуля, знает всё, что знала вчерашняя.
- Инструменты вместо интерфейса. Конфигуратор — только пакетно, тесты — Python через COM в одном сеансе, интерфейс — веб-клиент в браузере без окна, со снимками. Агенту нужны быстрые и однозначные ответы, а не кнопки.
- Доказательство вместо «готово». Каждое «сделано» — с номером коммита, выводом проверки или снимком. Главная сессия проверяет это сама: коммит действительно отправлен, тест действительно был красным.

С чего начать завтра, если вы 1С-ник и пробуете ИИ
- Заведите файл правил проекта и пишите туда каждую граблю: «пароль не передавать», «псевдоним В в запросах нельзя», «база такая-то». Агент прочитает его в начале каждой сессии.
- Выгрузите конфигурацию в файлы и держите в git. ИИ работает с текстом, а не с деревом конфигуратора; git даёт откат любой его ошибки.
- Одна рабочая база. Никаких «копия для теста» — правка в одной выглядит несделанной в другой.
- Первая автопроверка — компиляция модулей пакетным конфигуратором. Сломайте модуль нарочно и убедитесь, что она это видит.
- Не верьте слову «готово». Просите показать: вывод проверки, снимок формы, текст запроса, который выполнился на живой базе.
Что ИИ не умеет — и где без человека никак
- Решать, зачем. Агент одинаково старательно сделает полезную кнопку и бессмысленную. «Зачем это пользователю?» — вопрос, на который отвечаю я, и чаще всего ответ «незачем, убери».
- Смотреть глазами покупателя. За час, когда мы просто прошлись по формам глазами, нашлось девять дефектов, которые не ловили ни 44 теста, ни семь аудитов. Печать бланка в демо-базе падала, а тест печати был зелёным.
- Знать закон. Формат электронной накладной агент уверенно пересказывал по статьям и форумам. Правильно стало, только когда мы положили в проект официальные XSD-схемы налоговой и начали проверять файл по ним.
- Не торопиться с выводами. Агент однажды затёр рабочий токен Telegram-бота в демо-базе собственным тестом — проверял, что сотрудник не может его изменить, и изменил. Восстановили из журнала транзакций SQL. Теперь права проверяются через «ПравоДоступа», а не пробной записью.
Сколько это стоит
Подписки на ИИ за месяц стоят дешевле одного месяца работы программиста. Дороже обходится другое: внимание. ИИ не устаёт, а вы — да. Правила, которые экономят нервы:
- одна база для разработки, тестов и демо — никаких копий (однажды внешний ревьюер два часа проверял позавчерашнюю сборку: все четыре его замечания были про уже исправленное);
- всё, что агент узнал на своих ошибках, — записывать в базу знаний проекта, которую читает следующий агент;
- каждое «готово» агента — только с доказательством: вывод проверки, снимок экрана, номер коммита.
Итог
ИИ не заменил мне девятнадцать лет в 1С. Он их окупил: всё, что я знаю про грабли платформы и привычки бухгалтеров, теперь превращается в код в десять раз быстрее. Но только при одном условии — если не верить ему на слово. Не «ИИ написал», а «ИИ написал, другой ИИ опроверг, тест покраснел и позеленел, а я посмотрел глазами».
Сейчас тем же способом переписываю свои старые обработки — те самые, «для себя». Первыми пошли автосборки товаров для УТ 11.5: учёт резервов, о котором покупатели просили с 2024 года, выбор строк, сборка полуфабриката из сырья, работа с ордерным складом. Двадцать одна сценарная проверка, и каждая новая хоть раз покраснела. Код 2021 года остался в истории как напоминание, с чего начинали.
Продукт, на котором всё это проверено, — расширение «Путевые листы» для 1С:Бухгалтерии, УНФ и Управления торговлей. Код открыт — можно посмотреть, как устроены проверки.
А как у вас: доверяете коду от ИИ? И какой самый смешной (или дорогой) случай, когда он соврал?
Вступайте в нашу телеграмм-группу Инфостарт