Опыт общения рядового 1С-ника с GPT-3

Вступление

Я, конечно, слышал о том, что нейросеть теперь пишет рассказы, рисует картинки, а в свободное от этих хлопот время еще и немного программирует. Иногда какие-то примеры "творений" пробегали где-то на периферии внимания, но, что называется, не трогали душу.   

Как то раз, просматривая очередной обзор https://habr.com/ru/company/first/blog/678848/, наткнулся на сообщение о том что GPT-ать теперь, усилиями Сбербанка, можно и по-русски. Да, скорее всего, и раньше об этом слышал, но благополучно забыл. В этот раз про русские GPT там было такое бодренькое: я вот, дескать, ввел затравку про Антарктиду и смотрите, что у меня вышло.

История Антарктиды очень сильно отличается от других континентов нашей планеты.

RuGPT3: История Антарктиды очень сильно отличается от других континентов нашей планеты. В ней есть высокогорье и пустынные, безжизненные земли, но есть и многие и другие, где люди живут и размножаются. Почти во всех странах есть города и поселки, где живут люди. В Антарктиде довольно холодно и влажно, но даже в этой непыльной местности есть не только своя мода, но и свои устоявшиеся традиции, порой очень странные для жителей других регионов. На этом видео вы ...

Говорят, что дурной пример заразителен. Уж не знаю, что меня "пробило" на этот раз, но я решил, что сам попробую ввести ровно такой же запрос. RuGPT3 не заставила себя долго ждать. Ответ был совершенно другой. Но это правильно. Хороший писатель не станет повторяться.

История Антарктиды очень сильно отличается от истории других континентов нашей планеты.

RuGPT3: История Антарктиды очень сильно отличается от истории других континентов нашей планеты.
В нашей стране она становится "открытой" только в 1955 году, а за всю историю на ее землях побывало всего около 30 экспедиций, из которых лишь 3 высадились...

Все началось как-то чересчур культурно и скучно. Но через пару абзацев нейросеть все-таки сумела расшевелиться

На фото:Азимовский залив, Антарктика. Из-за ремонтных работ этот вертолет не смог сесть прямо на лед, чтобы забрать российский грузовой корабль "Прогресс М-26М", который стартовал с Байконура в 06:07 UTC (17:07 мск) с 73 тоннами груза на борту.

Черт побери! Я хотел бы увидеть это фото! Но с этим надо уже на другой сервис сбербанка, а сил на это не было никаких. Вдоволь насмеявшись, я понял, что пришло время как-то встроить все это в свою картину мира. 

Нейросеть  не может создать ничего нового. Вообще или пока еще - вопрос философский. Зато она может невероятно старательно работать со старым, в том числе, хорошо забытым. И если так случилось, что она вас понимает (что бы это ни значило), а внутри у нее весь Stack Overflow, тогда куда следует податься простому 1С-нику? Правильно, простому 1С-нику надо спрашивать не про Антарктиду, а про SELECT.

Что я немедленно и сделал. Только на этот раз уже на сайте https://openai.com/. У RuGPT3 спрашивать про SELECT бесполезно. А у OpenAI есть раздел CODEX. Все еще полностью доступный, т.е. полностью бесплатный.

Лабораторные исследования

Мне нравится срез последних. Задача не совсем примитивная, а формулируется просто и коротко. Дай последние значения! Пишем:

### Postgres SQL tables, with their properties:

#

# Rates(date, name, value)

#

### A query to list last values of each name

SELECT

Через несколько секунд получаем:

SELECT name, value, dateFROM Rates WHERE date = (SELECT MAX(date) FROM Rates AS r WHERE r.name = Rates.name) ORDER BY name

А неплохо! В 1С надо будет только вместо = поставить IN (В). Такое вот занудство, но мы про него знаем. Лично я всегда пользовался несколько иным методом, без коррелированного подзапроса. Но этот мне нравится больше. Идем дальше. Попробуем теперь получить накопительный итог

# Sales(date, name, qty)

#

### A query to list the cumulative sum of qty for names and dates

SELECT date, name, SUM(qty) OVER (PARTITION BY name ORDER BY date) AS qty FROM Sales ORDER BY date, name

Мда! Окна нам в 1С пока не завезли.  Так и сидим, можно сказать, в полной темноте. Я попробовал поговорить с нейросетью и строго (OVER prohibited) и просяще (I cannot use OVER). Бесполезно. Есть еще настройка случайности результата. Она почему-то называется Temperature (случайно?) Но и она вам не поможет. С другой стороны, результат-то вроде как правильный. Что-ж, подождем лучших времен. Я еще немного поэкспериментировал с выдуманными из своей головы запросами и перешел к полевым испытаниям.

Полевые испытания

Я решил найти на mista.ru парочку вопросов. Не совсем банальных, типа почему у меня соединение не работает, а чуть посложнее. Первый вопрос https://forum.mista.ru/topic.php?id=883998 звучал примерно так: хочу получить все документы, у которых одна табличная часть заполнена, а вторая нет. Пробуем в OpenAI

#tab1(id,name,qty)#tab2(id,name,qty)

#

### A query to list distinct id where tab1 has no rows by id and tab2 has rows by id

SELECT DISTINCT id FROM tab1 WHERE id NOT IN (SELECT id FROM tab2)

Обратите внимание. Там, в ветке на форуме, даны правильные ответы. Но этот не только правильный, но еще и компактный.

Второй вопрос https://forum.mista.ru/topic.php?id=826183 оказался посложнее. Для каждого товара надо сначала определить покупателя, который купил на самую большую сумму среди других покупателей этого товара, а потом вывести количество проданного этому покупателю этого товара. Спрашиваем:

#sales(buyer,name,qty,val)

#

## A query to list buyer,name,sum of qty where each buyer has largest sum of val by name

SELECT buyer,name,sum(qty)FROM sales GROUP BY buyer,name

HAVING sum(val) = (SELECT max(sum(val)) FROM sales  GROUP BY buyer,name)

И вертолет садится прямо на лед! Да, брат трансформер! Я тоже считаю, что всем нам необходимо вот это max(sum(val)) Но теневое мировое правительство, исходя из каких-то своих теневых мировых соображений наложило строгий запрет на такую конструкцию. И ее нет не только в 1С, но и вообще нигде. Жаль, но придется решать эту задачу самому.

Вывод

У нас, программистов, интересная работа. Вот только прежде, чем сделать немного интересного, надо сделать много, очень много неинтересного. Вернемся к самому первому примеру, он очень показателен. В 1С есть периодический регистр сведений. Для этого регистра определен метод (и соотвествующая виртуальная таблица) СрезПоследних(). Мы пользуемся всем этим, не особо задумываясь, а что там внутри. Но время от времени (и что важно, достаточно редко) возникают ситуации, когда надо построить срез последних самостоятельно. Нет соответствующего регистра и нет возможности вмешиваться в структуру базы. Или регистр есть, но, например, такой структуры:

период, товар, склад, цена

а вам потребовалось получить последние значения цены по товарам не важно на каком складе. На этом 1С-овский срез последних ломается и надо писать самому. Если вы думаете, что решение можно легко нагуглить, то вы ошибаетесь. Не знаю почему, но вот прямо сейчас и гугл и яндекс выдадут вам на нескольких страницах ссылки на что-то типа "срез последних на каждую дату". Придется потрудиться и поискать в результатах выдачи то, что вам действительно нужно. А потом еще придется потрудиться и вытащить рабочий текст запроса из статьи.

В общем, срез последних задача экзотическая и... неинтересная. Скорее всего вы будете решать ее в рамках чего-то по-настоящему интересного. И вам будет жаль тратить на нее больше 10 секунд своего времени. Прекрасно, что CODEX от OpenAI готов вам помогать в этом деле.

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