Можно ли использовать ChatGPT для написания кода 1С: анализ примеров и типичные ошибки

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

За основу возьмем обсуждение с форума, где один из участников поделился своим опытом использования Telegram-бота на базе ChatGPT для решения двух классических задач: перевода даты в миллисекунды и построения отчета по продажам.

Задача 1: Перевод даты в миллисекунды (Unix Timestamp)

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


Процедура ПеревестиДатаВМиллисекунды(Дата) Экспорт
    // Проверяем, что входной параметр является датой
    Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
        Сообщить("Некорректное значение даты.");
        Возврат;
    КонецЕсли;

    // Получаем количество секунд с начала эпохи Unix
    СекундыС1900 = Дата - '1970-01-01 00:00:00';
    
    // Переводим секунды в миллисекунды
    Миллисекунды = СекундыС1900 * 1000;

    // Выводим результат
    Сообщить("Дата в миллисекундах: " + Миллисекунды);
КонецПроцедуры

На первый взгляд, код выглядит вполне рабочим и логичным. Платформа 1С действительно позволяет вычитать даты, получая разницу в секундах. Однако, как справедливо заметили участники обсуждения, в коде есть небольшая, но показательная небрежность. Переменная названа СекундыС1900, в то время как вычитание производится от даты начала эпохи Unix — 1 января 1970 года. Это не влияет на работоспособность, но свидетельствует о том, что модель не до конца понимает контекст и может допускать логические неточности в именовании, что затрудняет чтение кода.

Для сравнения, вот более лаконичный и распространенный вариант решения этой задачи от опытного разработчика:


Функция ДатуВTimestamp(пДата = Неопределено) Экспорт
	Возврат Формат(Число(?(ТипЗнч(пДата) = Тип("Дата"), пДата, ТекущаяДата())-Дата("19700101")),"ЧН=0; ЧГ=0");
КонецФункции

Этот вариант использует функцию и возвращает значение, что более универсально, чем процедура с выводом сообщения.

Задача 2: Запрос на получение ТОП-10 контрагентов по продажам

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


ВЫБРАТЬ
    Контрагенты.Наименование КАК Контрагент,
    Сумма(Продажи.Сумма) КАК ОбщаяСумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ВНУТРЕНЕНЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО Продажи.Контрагент = Контрагенты.Ссылка
ГДЕ
    Продажи.Дата >= '2023-01-01' // Укажите нужный период
    И Продажи.Дата <= '2023-12-31' // Укажите нужный период
GROUP BY
    Контрагенты.Наименование
ORDER BY
    ОбщаяСумма Убывение
LIMIT 10;

Этот запрос содержит сразу несколько грубых ошибок, которые делают его неработоспособным и крайне неоптимальным. Разберем их по шагам.

  1. Использование `LIMIT` вместо `ВЫБРАТЬ ПЕРВЫЕ`. Конструкция LIMIT характерна для стандартного SQL (в частности, MySQL, на котором, вероятно, обучалась модель). В языке запросов 1С для ограничения количества записей используется ключевое слово ПЕРВЫЕ N в секции ВЫБРАТЬ.
  2. Обращение к физической таблице регистра накопления. Это самая серьезная архитектурная ошибка. Запрос обращается напрямую к таблице РегистрНакопления.Продажи, что заставляет систему перебирать все движения регистра за указанный период и агрегировать их "на лету". Платформа 1С для таких задач предоставляет мощный механизм — виртуальные таблицы. В данном случае необходимо использовать виртуальную таблицу Обороты. Она возвращает уже рассчитанные и сгруппированные данные, что в разы повышает производительность запроса.
  3. Неправильные ключевые слова и имена полей. В запросе используются слова `GROUP BY`, `ORDER BY`, `Убывение`, которые являются кальками с SQL. В 1С используются русскоязычные аналоги: СГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, УБЫВ. Кроме того, модель "выдумала" поле Сумма, хотя в типовых конфигурациях ресурс регистра продаж чаще называется Стоимость или СуммаПродаж.
  4. Некорректная работа с датами. Условие Продажи.Дата >= '2023-01-01' может работать некорректно. Для правильного включения границ периода в запросах 1С рекомендуется использовать параметры и функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА.

Правильный вариант запроса

Учитывая все замечания, посмотрим на правильный, оптимизированный вариант запроса, предложенный опытными программистами на форуме. Он использует виртуальную таблицу оборотов и корректный синтаксис 1С.


ВЫБРАТЬ ПЕРВЫЕ 10
    ПродажиОбороты.Контрагент,
    ПродажиОбороты.СуммаОборот КАК СуммаПродаж
ИЗ
    РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца) КАК ПродажиОбороты

УПОРЯДОЧИТЬ ПО
    СуммаПродаж УБЫВ

Проанализируем этот код:

В чем же силен ИИ?

Несмотря на провалы со специфическим кодом 1С, обсуждение показало и сильные стороны языковых моделей. Они отлично справляются с задачами, которые менее зависимы от конкретной платформы.

  1. Работа со строками. Пример с функцией для получения фамилии и инициалов показал, что ИИ хорошо знает стандартные функции встроенного языка (СтрРазделить, Лев) и может генерировать простые, работающие алгоритмы.
  2. Регулярные выражения и JavaScript. Участники отметили, что ChatGPT мастерски пишет и, что еще важнее, объясняет сложные регулярные выражения. Это может быть огромным подспорьем в работе.
  3. Объяснение кода. Одна из самых полезных функций ИИ — способность анализировать фрагмент кода и давать подробное пошаговое объяснение его работы. Это бесценно для обучения новичков или для быстрого вхождения в курс дела с чужим кодом.

Выводы и рекомендации

Так стоит ли использовать ChatGPT в работе 1С-программиста? Ответ — да, но с большой осторожностью и пониманием его ограничений.

Рассмотрим ключевые моменты:

В итоге, языковые модели уже сегодня могут стать полезным инструментом в арсенале разработчика. Они могут подсказать идею, сгенерировать шаблон для рутинной задачи или помочь разобраться в сложном коде. Но слепое копирование сгенерированного кода без понимания и проверки может привести к появлению неоптимальных и содержащих ошибки решений в вашей системе. Финальная ответственность за качество кода всегда остается на человеке.

← На главную