С появлением мощных языковых моделей, таких как ChatGPT, у многих разработчиков возникает соблазн делегировать им написание кода. В этой статье мы разберем реальные примеры генерации кода для 1С, проанализируем типичные ошибки, которые допускает искусственный интеллект, и выясним, насколько такой инструмент может быть полезен в повседневной работе программиста 1С.
За основу возьмем обсуждение с форума, где один из участников поделился своим опытом использования Telegram-бота на базе ChatGPT для решения двух классических задач: перевода даты в миллисекунды и построения отчета по продажам.
Начнем с относительно простой задачи. Автор попросил ИИ написать процедуру для перевода даты в миллисекунды. Вот что предложил ChatGPT:
Процедура ПеревестиДатаВМиллисекунды(Дата) Экспорт
// Проверяем, что входной параметр является датой
Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
Сообщить("Некорректное значение даты.");
Возврат;
КонецЕсли;
// Получаем количество секунд с начала эпохи Unix
СекундыС1900 = Дата - '1970-01-01 00:00:00';
// Переводим секунды в миллисекунды
Миллисекунды = СекундыС1900 * 1000;
// Выводим результат
Сообщить("Дата в миллисекундах: " + Миллисекунды);
КонецПроцедуры
На первый взгляд, код выглядит вполне рабочим и логичным. Платформа 1С действительно позволяет вычитать даты, получая разницу в секундах. Однако, как справедливо заметили участники обсуждения, в коде есть небольшая, но показательная небрежность. Переменная названа СекундыС1900, в то время как вычитание производится от даты начала эпохи Unix — 1 января 1970 года. Это не влияет на работоспособность, но свидетельствует о том, что модель не до конца понимает контекст и может допускать логические неточности в именовании, что затрудняет чтение кода.
Для сравнения, вот более лаконичный и распространенный вариант решения этой задачи от опытного разработчика:
Функция ДатуВTimestamp(пДата = Неопределено) Экспорт
Возврат Формат(Число(?(ТипЗнч(пДата) = Тип("Дата"), пДата, ТекущаяДата())-Дата("19700101")),"ЧН=0; ЧГ=0");
КонецФункции
Этот вариант использует функцию и возвращает значение, что более универсально, чем процедура с выводом сообщения.
Здесь ситуация оказалась гораздо интереснее. Запрос — более сложная и специфичная для 1С сущность, и именно тут проявились основные слабости языковой модели. Вот что сгенерировал ИИ:
ВЫБРАТЬ
Контрагенты.Наименование КАК Контрагент,
Сумма(Продажи.Сумма) КАК ОбщаяСумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
ВНУТРЕНЕНЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Продажи.Контрагент = Контрагенты.Ссылка
ГДЕ
Продажи.Дата >= '2023-01-01' // Укажите нужный период
И Продажи.Дата <= '2023-12-31' // Укажите нужный период
GROUP BY
Контрагенты.Наименование
ORDER BY
ОбщаяСумма Убывение
LIMIT 10;
Этот запрос содержит сразу несколько грубых ошибок, которые делают его неработоспособным и крайне неоптимальным. Разберем их по шагам.
LIMIT характерна для стандартного SQL (в частности, MySQL, на котором, вероятно, обучалась модель). В языке запросов 1С для ограничения количества записей используется ключевое слово ПЕРВЫЕ N в секции ВЫБРАТЬ.РегистрНакопления.Продажи, что заставляет систему перебирать все движения регистра за указанный период и агрегировать их "на лету". Платформа 1С для таких задач предоставляет мощный механизм — виртуальные таблицы. В данном случае необходимо использовать виртуальную таблицу Обороты. Она возвращает уже рассчитанные и сгруппированные данные, что в разы повышает производительность запроса.СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, УБЫВ. Кроме того, модель "выдумала" поле Сумма, хотя в типовых конфигурациях ресурс регистра продаж чаще называется Стоимость или СуммаПродаж.Продажи.Дата >= '2023-01-01' может работать некорректно. Для правильного включения границ периода в запросах 1С рекомендуется использовать параметры и функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА.Учитывая все замечания, посмотрим на правильный, оптимизированный вариант запроса, предложенный опытными программистами на форуме. Он использует виртуальную таблицу оборотов и корректный синтаксис 1С.
ВЫБРАТЬ ПЕРВЫЕ 10
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаОборот КАК СуммаПродаж
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца) КАК ПродажиОбороты
УПОРЯДОЧИТЬ ПО
СуммаПродаж УБЫВ
Проанализируем этот код:
ВЫБРАТЬ ПЕРВЫЕ 10 — используется правильная конструкция 1С для получения топ-10 записей.РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца) — запрос обращается к виртуальной таблице Обороты, передавая ей в качестве параметров начало и конец периода. Платформа сама выполнит все необходимые расчеты наиболее эффективным способом.УПОРЯДОЧИТЬ ПО ... УБЫВ — используется корректный синтаксис для сортировки.Несмотря на провалы со специфическим кодом 1С, обсуждение показало и сильные стороны языковых моделей. Они отлично справляются с задачами, которые менее зависимы от конкретной платформы.
СтрРазделить, Лев) и может генерировать простые, работающие алгоритмы.Так стоит ли использовать ChatGPT в работе 1С-программиста? Ответ — да, но с большой осторожностью и пониманием его ограничений.
Рассмотрим ключевые моменты:
РегистрНакопления.Продажи, реквизит Стоимость) и явно упоминать, что код пишется для платформы "1С:Предприятие".В итоге, языковые модели уже сегодня могут стать полезным инструментом в арсенале разработчика. Они могут подсказать идею, сгенерировать шаблон для рутинной задачи или помочь разобраться в сложном коде. Но слепое копирование сгенерированного кода без понимания и проверки может привести к появлению неоптимальных и содержащих ошибки решений в вашей системе. Финальная ответственность за качество кода всегда остается на человеке.