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

Разработка промпта

Итак, после работы обновлятора мы имеем ошибку применения расширения в нескольких функциях. Эксперименты начнем с ChatGPT, и для начала узнаем, что он знает о директивах «ИзменениеИКонтроль»?

Ок, бред, понятно. 

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

Ок, подходит. Можно приступать к переносу изменений в процедурах. 

Первый успех

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

 

Всего в процедуре 2 удаления и 4 вставки. Далее привожу в сокращенном виде диалог с ChatGPT, в формате З (запрос), О (ответ). Запросы привожу как есть, в ответах только суть. ИИ любит развернутые ответы, если приводить полный текст ответа, статья рискует превысить объем большой советской энциклопедии. Итак, диалог:

З: у меня есть функция, которую я доработал с использованием директивы «ИзменениеИКонтроль»

<Текст функции с изменениями>

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

<Текст функции из нового релиза>

О: Ок я понял, что ты хочешь, но текст большой, мне тяжеловато будет весь обработать без ошибок. Намекает, чтобы я сделал часть работы сам и упростил ему задачу. Далее он пускается в рассуждения о содержимом кода, и предлагает два варианта: А — выдать полную функцию, вариант Б — только изменения. 

З: Вариант А

О: Хорошо я сделаю, но ты прислал твой доработанный вариант, но не прислал типовой оригинал, который был в тот момент. Дальше много текста, почему это важно. 

З: хорошо, вот исходная версия 

<Текст исходной процедуры без изменений>

О: Отлично, теперь у меня есть всё:

  • твоя доработанная версия,

  • новая типовая версия,

  • исходная типовая, на основе которой была доработка.

Теперь я могу полностью собрать готовую процедуру со всеми твоими вставками, строго по правилам «&ИзменениеИКонтроль».

❗Прежде чем я сгенерирую итоговую версию

Мне нужно уточнить один важный момент:

Далее он пускается в рассуждения о сути кода, и в конце выдает два варианта:
1) просто перенести изменения,
2) зарефакторить изменения. 

З: 1

О: Думал на протяжении 2m 18s

Вот готовый вариант процедуры с перенесёнными правками и директивами «ИзменениеИКонтроль» под новую типовую версию:

<Текст измененной процедуры>

Отлично, первый результат есть, идем в конфигуратор, вставляем процедуру, запускаем проверку применения расширения и … проверка проходит! С этой процедурой больше нет конфликта и можно двигаться дальше.

Не все так просто

У нас есть диалог, в котором мы уже научили ChatGPT работе с директивой «ИзменениеИКонтроль», объяснили что мы от него хотим. В общем, все готово — бери и вставляй процедуры. Так и сделаем. 

З: вот новая процедура 

<текст процедуры>

вот моя с изменениями

<текст процедуры>

Дальше пытаюсь вставить в рамках одного запроса текст из нового релиза, но Chat GPT говорит, что превышено количество символов в запросе, поэтому завершаю запрос так:

дальше отправлю исходный вариант

О: Хорошо, я готов.

З: <Текст процедуры>

О: Отлично — теперь у меня есть все три версии:

  1. Новая типовая процедура (последняя в поставке)

  2. Твоя доработка (с заменой Аналитики на Контрагента)

  3. Исходная типовая, на которой ты делал доработку

❗ ВАЖНЫЙ ВОПРОС — и ты пока не отвечал на него

Здесь он пускается в рассуждения о том, что было в моей первой процедуре (с которой он успешно справился) и что в этой. Происходит диалог, несколько безуспешных попыток сформировать текст процедуры. В результате я делаю вывод, что у ИИ уже запутался в контексте и надо создавать новый диалог. Кстати, когда писал статью, заметил, вторая процедура была с аналогичным названием, но из модуля документа «РасходнаяНакладная», не удивительно, что у ИИ каша в голове контекстном окне образовалась. Вторая процедура кстати уже побольше, 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С разработчика в команду.

Комментарии (0)