Добавить в корзинуПозвонить
Найти в Дзене
Web-Admin

1С: Язык запросов. Получить самый продаваемый товар по контрагенту

Тут пришлось делать задачу, где нужно было вытащить из Регистра накопления с видом Обороты самый продаваемый товар по списку контрагентов и первая мысль, которая пришла в голову - да это легко и за пару минут сделаю такой запрос, а оказалось, что не всё так просто. Т.е. в итоге должна была появиться таблица с самым продаваемым товаром по каждому контрагенту с двумя столбцами Контрагент и Товар, которую нужно вытащить из Регистра накопления с видом обороты, где два измерения - контрагент и товар, и в качестве ресурса - количество. К примеру, возьмем табличку из Excel: И здесь у контрагента "Лучший клиент" есть купленные товары - Мышь компьютерная, процессор и клавиатура. Как видно по табличке, необходимо вытащить для Контрагента "Лучший клиент" самый покупаемый товар - Процессор, который продали данному контрагенту 30 раз. Первая мысль, конечно, было просто сгруппировать, а сумму оборотов сделать по максимуму, но тут же данная мысль была отметена, т.к. в данном случае не получится вывес

Тут пришлось делать задачу, где нужно было вытащить из Регистра накопления с видом Обороты самый продаваемый товар по списку контрагентов и первая мысль, которая пришла в голову - да это легко и за пару минут сделаю такой запрос, а оказалось, что не всё так просто.

Т.е. в итоге должна была появиться таблица с самым продаваемым товаром по каждому контрагенту с двумя столбцами Контрагент и Товар, которую нужно вытащить из Регистра накопления с видом обороты, где два измерения - контрагент и товар, и в качестве ресурса - количество.

К примеру, возьмем табличку из Excel:

И здесь у контрагента "Лучший клиент" есть купленные товары - Мышь компьютерная, процессор и клавиатура.

-2

Как видно по табличке, необходимо вытащить для Контрагента "Лучший клиент" самый покупаемый товар - Процессор, который продали данному контрагенту 30 раз.

Первая мысль, конечно, было просто сгруппировать, а сумму оборотов сделать по максимуму, но тут же данная мысль была отметена, т.к. в данном случае не получится вывести контрагента только один раз, ведь группировать приходится контрагента и товар вместе.

А это позволит вытащить данные по одному контрагенту только в таком виде:

-3

Если группировать только Контрагента, а по Товару делать Максимум, то получится полная глупость. Да, каждый контрагент будет только один раз, но вот товар будет выдаваться рандомно, а точнее отсортируется по алфавиту и запрос выдаст максимальное значение, а здесь это Процессор.

Т.е. у каждого контрагента, если брать текущую таблицу - в качестве лучшего товара будет Процессор.

Условием же является - нужно вытащить по каждому контрагенту свой самый продаваемый товар.

Конечно, похожую выборку можно дальше легко обработать с помощью кода 1С, но сам себе поставил задачу - вытащить правильную таблицу именно с помощью запроса.

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

Начал искать, как другие люди решали похожую задачу, но там все советы были неправильными. Даже полез в ChatGPT, что бы он помог решить проблему и даже ИИ выдал ошибочное решение 😁

Решение задачи

Спустя пол часа после поисков в Интернете мне приходит в голову гениальная мысль по решению данной задачи, и решение оказалось простым как 3 копейки 😁

Берём целиком виртуальную таблицу оборотов по данному регистру (т.к. это оборотная виртуальная таблица, то данные там уже сгруппированы).

Дальше заносим получившиеся данные во временную таблицу ВТ_ТоварКонтрагент и делается следующий запрос уже к этой временной таблице, но вытаскивается только Контрагент и Количество, где группируется Контрагент и получается максимум. Получившейся запрос помещаем во вторую временную таблицу ВТ_Контрагент.

Дальше делается третий запрос, где получаются данные из предыдущих двух временных таблиц, делая левое соединение, где Контрагент и Количество из таблицы ВТ_Контрагент равны Контрагенту и Количеству из временной таблицы ВТ_ТоварКонтрагент.

И получаем абсолютно правильный результат работы запроса:

-4

А сам запрос на скриншоте: