
На связи Сергей Скирдин, технический директор ИТ-интегратора «Белый код». Близится конец года, с новыми налоговыми изменениями, а значит, нужно обновить наши учетные системы. Обычно этой работой занимается свободный 1С программист, но в этом году все упорно трудятся на проектах. С основной рутинной работой по обновлению успешно справляется обновлятор, но при обновлении доработанных модулей приходится вручную разбираться с конфликтами. Работа не сложная, но требует концентрации и внимания на деталях. В этом году мы активно начали использовать ИИ в режиме чата и в режиме агента. Давайте попробуем и эту работу поручить ИИ. Кому интересен только результат, мотайте сразу до заключения, там ссылка на репо.
Разработка промпта
Итак, после работы обновлятора мы имеем ошибку применения расширения в нескольких функциях. Эксперименты начнем с ChatGPT, и для начала узнаем, что он знает о директивах «ИзменениеИКонтроль»?

Ок, бред, понятно.
Берем из поисковика первую ссылку по запросу работа с директивами «ИзменениеИКонтроль», отправляем ссылку для изучения и просим повторить ответ на вопрос:

Ок, подходит. Можно приступать к переносу изменений в процедурах.
Первый успех
Первой в конфликт применения выпала процедура «СформироватьТаблицаДоходыИРасходы» модуля менеджера документа «АктВыполненныхРабот». Процедура небольшая, всего 200 строк. Код подготавливает таблицу, по которой дальше формируются движения по регистру «ДоходыИРасходы». Суть доработки — в аналитику, вместо неопределено подставить контрагента. Не знаю, почему в типовой так не сделано, ну да ладно.

Всего в процедуре 2 удаления и 4 вставки. Далее привожу в сокращенном виде диалог с ChatGPT, в формате З (запрос), О (ответ). Запросы привожу как есть, в ответах только суть. ИИ любит развернутые ответы, если приводить полный текст ответа, статья рискует превысить объем большой советской энциклопедии. Итак, диалог:
З: у меня есть функция, которую я доработал с использованием директивы «ИзменениеИКонтроль»
<Текст функции с изменениями>
И есть новая версия этой процедуры. Нужно в нее перенести мои изменения, аккуратно вставив директивы. Обрати внимание, изменения должны быть окружены директивами вставки либо удаления, все что вне директив должно остаться неизменным. Вот новая версия:
<Текст функции из нового релиза>
О: Ок я понял, что ты хочешь, но текст большой, мне тяжеловато будет весь обработать без ошибок. Намекает, чтобы я сделал часть работы сам и упростил ему задачу. Далее он пускается в рассуждения о содержимом кода, и предлагает два варианта: А — выдать полную функцию, вариант Б — только изменения.
З: Вариант А
О: Хорошо я сделаю, но ты прислал твой доработанный вариант, но не прислал типовой оригинал, который был в тот момент. Дальше много текста, почему это важно.
З: хорошо, вот исходная версия
<Текст исходной процедуры без изменений>
О: Отлично, теперь у меня есть всё:
твоя доработанная версия,
новая типовая версия,
исходная типовая, на основе которой была доработка.
Теперь я могу полностью собрать готовую процедуру со всеми твоими вставками, строго по правилам «&ИзменениеИКонтроль».
❗Прежде чем я сгенерирую итоговую версию
Мне нужно уточнить один важный момент:
Далее он пускается в рассуждения о сути кода, и в конце выдает два варианта:
1) просто перенести изменения,
2) зарефакторить изменения.
З: 1
О: Думал на протяжении 2m 18s
Вот готовый вариант процедуры с перенесёнными правками и директивами «ИзменениеИКонтроль» под новую типовую версию:
<Текст измененной процедуры>
Отлично, первый результат есть, идем в конфигуратор, вставляем процедуру, запускаем проверку применения расширения и … проверка проходит! С этой процедурой больше нет конфликта и можно двигаться дальше.
Не все так просто
У нас есть диалог, в котором мы уже научили ChatGPT работе с директивой «ИзменениеИКонтроль», объяснили что мы от него хотим. В общем, все готово — бери и вставляй процедуры. Так и сделаем.
З: вот новая процедура
<текст процедуры>
вот моя с изменениями
<текст процедуры>
Дальше пытаюсь вставить в рамках одного запроса текст из нового релиза, но Chat GPT говорит, что превышено количество символов в запросе, поэтому завершаю запрос так:
дальше отправлю исходный вариант
О: Хорошо, я готов.
З: <Текст процедуры>
О: Отлично — теперь у меня есть все три версии:
Новая типовая процедура (последняя в поставке)
Твоя доработка (с заменой Аналитики на Контрагента)
Исходная типовая, на которой ты делал доработку
❗ ВАЖНЫЙ ВОПРОС — и ты пока не отвечал на него
Здесь он пускается в рассуждения о том, что было в моей первой процедуре (с которой он успешно справился) и что в этой. Происходит диалог, несколько безуспешных попыток сформировать текст процедуры. В результате я делаю вывод, что у ИИ уже запутался в контексте и надо создавать новый диалог. Кстати, когда писал статью, заметил, вторая процедура была с аналогичным названием, но из модуля документа «РасходнаяНакладная», не удивительно, что у ИИ каша в голове контекстном окне образовалась. Вторая процедура кстати уже побольше, 250 строк.
Фиксируем неудачу, и идем дальше экспериментировать.
Разработка промпта, подход второй
Чтобы не было каши в контексте, будем делать в рамках диалога одну процедуру. И чтобы нам не отвечать на 100500 вопросов говорливого ассистента, напишем сразу исчерпывающий промпт. Писать самому лень, а кто у нас хорошо пишет промпты для ИИ? Правильно — сам ИИ. Ставим задачу:
З: Мне нужно составить промпт для chatgpt, чтобы ты помог мне решить задачу с обновлением расширения. Суть задачи в переносе моих доработок, выполненных с использованием «ИзменениеИКонтроль» в обновленные модули. Ссылка на описание работы с аннотацией https://tnsoft.ru/blog/ispolzovanie-annotatsii-izmenenieikontrol-na-primerah/?ysclid=mie3jf7e35915561634 Если есть дополнительные вопросы, спрашивай.
Дальше происходит небольшой диалог и в итоге рождается промт. Этот промт проходит цикл испытаний на процедуре в 250 строк, по ходу испытаний он дополняется деталями. Вот такой вариант приводит к успешному переносу изменений без лишних рассуждений и вопросов:
Мне нужна помощь с переносом моих доработок в модули конфигурации «1С:Предприятие».
Доработки были выполнены с использованием аннотации «ИзменениеИКонтроль» — вставки #Вставка/#КонецВставки и удаления #Удаление/#КонецУдаления.
Описание механизма: https://tnsoft.ru/blog/ispolzovanie-annotatsii-izmenenieikontrol-na-primerah/?ysclid=mie3jf7e35915561634
Сейчас имеется новая версия модулей, и нужно выполнить перенос моих изменений в актуальный код.
Твоя задача (строго выполнять без дополнительных вопросов):
Проанализировать мои доработки: определить, какие вставки и удаления были внесены между старой типовой процедурой/функцией и изменённой версией с аннотациями.
Сопоставить:
Вариант 1 — исходная типовая процедура
Вариант 2 — та же процедура с моими изменениями
Вариант 3 — новая типовая версия процедуры
и определить, куда нужно перенести мои доработки.
Сформировать итоговый текст новой процедуры/функции с корректно встроенными директивами
#Вставка/#КонецВставки
#Удаление/#КонецУдаления.
Категорически запрещено менять форматирование процедур и функций:
нельзя добавлять или удалять пробелы;
нельзя изменять отступы;
нельзя добавлять или убирать пустые строки;
нельзя изменять тип кавычек;
нельзя менять порядок объявлений.
Текст новой процедуры должен быть побитово идентичен варианту 3 — за исключением вставленных блоков.
Обрати внимание:
Вариант 1 и Вариант 2 имеют разное имя процедуры (у Варианта 2 имеется префикс расширения).
Итоговая обновленная процедура должна иметь то же имя, что и измененная процедура из Варианта 2, независимо от названия процедуры в варианте 3.
Никаких дополнительных изменений имени, параметров, экспортов и т. п. делать нельзя.
Не задавай никаких уточняющих вопросов.
После предоставления мной трёх текстов процедуры ты должен сразу выдать:
итоговый корректный текст новой процедуры/функции с донесёнными изменениями,
без пояснений, без анализа, только итоговый модуль.
Ну все, схема отработана. Промпт есть, теперь осталось механическая работа — создавай диалог, копируй туда промпт, три процедуры и дело в шляпе…
Большие процедуры
И действительно, пару процедур я успешно обновил, а потом дошел до «СформироватьТаблицаЗапасыПродажа» из расходной накладной. В ней всего 4 вставки, но сама процедура около 1000 строк.
По этой процедуре состоялся забавный диалог:
З: <Промпт>
О: Готов. Пожалуйста, предоставьте три варианта процедуры (Вариант 1, Вариант
2, Вариант 3) в отдельных блоках — я сразу выдам итоговый модуль.
З: <Текст исходной процедуры>
О: Получил Вариант 1.
Пожалуйста, пришлите Вариант 2 и Вариант 3 — после этого я сразу выдам итоговый модуль без комментариев.
З: <Текст с изменениями>
О: Получил Вариант 2.
Пожалуйста, пришлите Вариант 3 — после этого сразу выдам итоговый модуль без комментариев.
З: <Текст из нового релиза>
О: Принято. Я получил:
Вариант 3 — новая типовая версия процедуры СформироватьТаблицаЗапасыПродажа.
Для завершения переноса мне теперь нужно Вариант 2 — вашу доработанную версию процедуры с аннотациями #Вставка, #Удаление.
Пожалуйста, предоставьте Вариант 2. После этого я сразу выполню перенос изменений в Вариант 3 с учётом всех ваших требований.
Хм. Пересматриваю диалог, все три процедуры отправлены… Ну ок, отправляю еще раз Вариант 2, получают ответ: теперь нужен Вариант 1… Занавес.
ChatGPT 5.1 не справился с процедурой на 1000 строк. Да, понятно, что можно кусочками отправить, но тогда потеряется весь смысл, придется напрягать свою голову, а своя голова нужна для более важных дел.
Пробуем другие модели
Что еще попробовать? Ну конечно, бесплатную китайскую модель.
DeepSeek
З: <Промт>
Думал 463 секунд.
О: Ожидаю три текста процедуры/функции:
Исходная типовая версия.
Измененная версия с директивами.
Новая типовая версия.
После получения всех трех вариантов сразу предоставлю итоговый текст с перенесенными доработками.
З: <текст исходной процедуры>
В ответ он почему-то сразу начал печатать процедуру, не дождавшись вариантов с изменениями и обновленной процедуры. Мне стало интересно, что он там печатает, не имея даже варианта с изменениями. В итоге оказалось, что он перепечатал мне всю мою процедуру, только в одном запросе заменил часть слова «Пустая» на китайские иероглифы.

Я не поленился, спросил у него, что это за иероглифы такие? Оказалось они означают «пустырь», так что применил он их по месту.
Попробовал отключить «Глубокое мышление». Без него DeepSeek выдает результат моментально (а не через 7 минут), и результат абсолютно аналогичный. Я и ранее замечал, что DeepSeek можно использовать для простеньких задач, когда лень или нет возможности через VPN использовать ChatGPT. Причем использование «глубокого мышления» ни разу ни к чему хорошему не привело.
Claude.ai
Ранее не работал с Claude. Попробуем бесплатную версию. Качаем приложение, регистрируемся на gmail, начинаем работу по копи/пасту:

Бесплатной версии хватило, чтобы принять Вариант 1 и Вариант 2, далее Claude предложил заплатить денеги или подождать до 8 утра следующего дня. Ок, оплачиваем подписку и продолжаем. С продолжением тоже не очень гладко:

Готовая процедура не влезла в одно сообщение, и Claude разбил его на два. Это конечно не очень удобно, с учетом того, что 1С проверяет код побитово и не позволяет сделать ни лишних отступов, ни форматирования. С ChatGPT такая проблема легко решается — нужно попросить вывести результат в файл для скачивания.

Вроде бы он понял задачу, даже название файла написал, но по результату работы никакого файла не появилось. Я спросил, как скачать файл, на что он снова начал выводить текст процедуры и снова она не поместилась:


Ну что, снова нет успеха.
Битва агентов
Раз Claude не может выдать текст файлом, попробуем сформировать текст в режиме агента. И раз уж дело дошло до агентов, дадим шанс ChatGPT и агенту Codex.
Codex — отличная штука, когда нужно что-то написать на питоне. ChatGPT и в режиме чата неплохо справляется, я себе таким образом навайбкодил Телеграмм-бота для транскрибации встреч. Прелесть Codex в том, что он может не только писать код, но и запускать его, тестить, смотреть результаты, корректировать по результатам код, снова запускать. То есть, вы можете буквально поставить задачу, пойти попить чаю и получить готовый, рабочий проект. Настроить Codex просто - в vscode качаем расширение, запускаем и авторизуемся через ChatGPT. Причем не нужно отдельно оплачивать токены API, обычная подписка за 20$ прекрасно работает.
Итак, создаем два каталога, один для ChatGPT, другой для Claude, размещаем в них одинаковый набор:
- Инструкция по работе с аннотацией «ИзменениеИКонтроль.md» — краткое руководство по синтаксису директив #Вставка/#Удаление и требованиям к соответствию типового кода для ИИ.
- «промпт.md» — промпт для ИИ.
- «ПроцедураДоОбновленияБезИзменений.bsl» — пустой файл для вставки в него
типовой версии процедуры до обновления, без изменений.
- «ПроцедураДоОбновленияСИзменениями.bsl» — версия до обновления с изменениями «&ИзменениеИКонтроль».
- «ПроцедураПослеОбновления.bsl» — новая типовая версия из обновленной конфигарации.
- «ПроцедураПослеОбновленияСИзменениями.bsl» — целевой файл: обновлённый модуль с перенесенными правками.
И там и там отправляем агенту простую команду: «задача описана в промпт.md».

Codex справился первый:

Дифф показывает изменение имени процедуры и две перенесенные вставки, все ок. Конфигуратор тоже принял изменения. Успех!
Claude закончил чуть позже и тоже с успешным результатом.

Заключение
Остальные процедуры (штук 10) я прогнал через Codex, как-то с ним удобнее в VS Code работать. Кстати от Claude я тоже поставил расширение в VS Code, но почему-то оно не появилось, пока с этим не разобрался.
Для маленьких процедур я пробовал еще раз вернуться в режим чата (вроде так побыстрее), но в итоге вернулся в агента из-за того, что в веб-версии все время какие-то косяки с форматированием:

Итого, эксперимент считаю удачным. ИИ-агентов можно и нужно применять для обновления 1С-ки. Здорово было бы разобраться со скриптами обновлятора, для автоматизации процесса взаимодействия с агентом, но у меня изменений не так много, чтобы тратить на это время.
Финальный промт и инструкцию для ИИ загрузил в репо https://github.com/skirdinsa/1c-merge-prompt, делайте клон, пользуйтесь на здоровье.
В процессе всей этой эпопеи я еще раз убедился: автоматизация — отличная штука, особенно когда на нее не уходит больше времени, чем на ручную работу. Но обновление — это не просто «перенести изменения», это в первую очередь инженерная задача: понять, что за чем стоит, что с чем стыкуется, и как не развалить систему из-за одной строки.
Если вы это понимаете — мы ищем 1С разработчика в команду.