Встретились как то 1C, Python и ChatGPT

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

Для написания простеньких кодов на языке Python мы давно приловчились использовать ChatGPT, но любопытство подтолкнуло проверить данный сервис на возможности написания кода на языке 1С.   В качестве доступа к боту для удобства используем бота @GPT4Telegrambot в Telegram. Очень удобно и достаточно оперативно работает.

В привычной манере написав пару запросов боту из разряда «напиши функцию преобразования телефонного номера к международному формату на языке 1с» или «напиши процедуру Записи структуры в регистр на языке 1с» — понимаем, что модель еще плохо обучена для данного языка и результат имеет некоторые ошибки или не точности. По традиции «доработать напильником» и в целом должно сработать. Если подобные запросы писать под Python — ошибок гораздо меньше, хотя сама логика как правило совпадает. Вот пример запроса для языка 1С, что в нем не так, поймете сами)

Пример ответа ChatGPT
function_convertPhone_1с_ChatGPT

Одним словом, не прижилось использование ChatGPT как помощника программиста 1С, и писать про это было нечего. Но недавно для решения одной задачи потребовалось использовать и 1С, и Python вместе с ChatGPT — вот об этом на самом деле данная статья.

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

Встроенного средства для извлечения данных из .rar архива на момент реализации данной задачи в 1С не подвезли. Вызывать что-то из системы вроде UnRAR в контексте сервера так же не получится. В итоге как на тот момент казалось, в голову пришла отличная идея — написать простенький сервис на Python, который будет скачивать архивы, и извлекать из них данные в указанную папку. Обобщенная схема сервиса должна выглядеть так:

shema_obmena_rar

Суть такая: запущенное фоновое задание в 1С определяет ссылки по которым ему нужно скачать архивы, создает папки для архивов и отправляет на web-сервер, который мы напишем на Python, запрос в котором укажем ссылку на файл, путь к папке, в которую нужно положить извлеченный из архива файл, а также уникальный идентификатор, что бы идентифицировать данный конкретный запрос. Web-сервер должен принять ссылку, поставить файл на скачивание и подтвердить, что задание получено. Скачивание файла занимает длительное время, поэтому скачивание извлечение запускается параллельно от самого web-сервера. Как только файл скачается и будет извлечен в нужную папку, мы пошлем запрос на HTTP-сервис 1С в котором укажем, что по полученному заданию файлы скачались и были извлечены. Можно продолжать с ними работать, что 1С с удовольствием и сделает.

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

  1. Нам нужен web-сервер, который будет принимать запрос и запускать функцию скачивания параллельно. Пишем запрос в ChatGPT. После пары попыток вопрос приобрел вот такую форму: «напиши код на python где сервер flask принимает запрос и запускает параллельно функцию с командой sleep(60) и не дожидаясь ее выполнения возвращает результат запроса» sleep(60) —  имитирует скачивание файла или любое другое длительное выполнение функции. Вот результат, который вернул бот, и он работает!

resultat_zaprosa_v_ChatGPT_web-server

И самое замечательное, что кроме самого кода, есть описание что и как происходит. Идем далее….

2. Нужна функция которая скачает файл по url-ссылке и положит его в нужную папку. Вот такой пишем запрос боту: «напиши функцию на языке python которая скачает файл из интернета по заданной ссылке в указанную папку и после выполнения вернет путь к скачанному файлу» и получаем результат:

resultat_zaprosa_chatGPT_skachat_file

Круто! есть даже пример использования, и код снова работает без корректировок. Двигаемся дальше…

3. Функция которая извлечет файлы из rar архива в указанную папку, вот наш запрос боту: «напиши функцию на языке python которая принимает путь к файлу rar архива и извлекает из него файлы в указанную папку. в результате возвращает путь до извлеченного файла» и ответ бота:

resultat_ChatGPT_rar_ex

4. И еще один штрих — функция которая «уведомит» нашу 1С систему http-запросом, о том, что файл скачался и доступен по пути из запроса, наш вопрос боту: «напишу функцию на языке python которая отправит http запрос POST на указанный адрес в теле которого будет json с указанной строкой» и его как всегда быстрый ответ:

rezultat_ChatGPT_POST_http

 

Итак, мы весь наш сервис разобрали на отдельные функции, осталось только собрать их в нужном порядке. А дело будет так: мы запускаем web-сервер из шага №1 и вместо sleep(60) укажем функцию из шага №2, которая начнет скачивание файла. (есть небольшое упущение, в том, что при получении запроса web-сервером нужно вытащить из его тела json с ссылкой на архив и путем куда сохранить. Так же сам сервер flask нужно запускать готовым принимать POST запросы, но это мелочи, решаются гуглом или так же запросом боту) После скачивания файла, запускаем извлечение данных из архива — функцией из шага №3, а по завершении отправляем запрос функцией из шага №4.

Звучит как план, но для конечной рабочей реализации нужно «сгладить шероховатости». Конечно я соврал, когда сказал, что знание Python не нужно. На самом деле нужно, для понимания как установить пакеты, где их импортировать, какой вообще синтаксис языка и т.д. Но базовые знания можно получить из какого-нибудь вводного курса в Python, которых на просторах цифровой бездны достаточно. К тому же поисковики Гугл или Яндекс — всегда в помощь.

 

Write a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Close