Сквозной рейтинг по иерархии в отчете на СКД




Сквозная нумерация (рейтинг) по группам и элементам справочника в отчете СКД согласно убыванию количества/суммы и т.д.

Постановка задачи

Добавить в отчет колонку "Рейтинга".

Рейтинг должен строиться по правилу, чем больше сумма параметра, тем выше рейтинг. В рейтинг должны попадать не только элементы, но и группы.

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

Реализовывать отчет можно в любой конфигурации и с любыми данными. Для примера я взял УТ 11.4 и рейтинг буду строить на основании данных регистра накопления ВыручкаИСебестоимостьПродаж.

Рейтинг будем строить по номенклатуре по трем ресурсам: Количеству, Стоимости и Выручке.

Сформируем отчет:

Чтобы понять, как формировать рейтинг проставим сперва его вручную — это будет тот результат, на который будем ориентироваться.

Задача в принципе простая, если не считать, что в рейтинг должны попадать не только элементы.

Давайте подумаем, как это можно сделать. 

Если бы рейтинг строился бы только по элементам, нам бы достаточно было бы получить во временной таблице данные по количеству и потом, соединив таблицу саму с собой, получить порядковый номер рейтинга.

 

Рейтинг без групп: Текст запроса

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

СГРУППИРОВАТЬ ПО
ВыручкаИСебестоимостьПродаж.АналитикаУчетаНоменклатуры.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СУММА(втДанныеПоКоличеству.Элемент) КАК КоличествоЭлементов
ПОМЕСТИТЬ втКоличествоЭлементов
ИЗ
втДанныеПоКоличеству КАК втДанныеПоКоличеству
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втДанныеПоКоличеству.Номенклатура КАК Номенклатура,
втДанныеПоКоличеству.Количество КАК Количество,
СУММА(ЕСТЬNULL(втДанныеПоКоличествуРейтинг.Элемент,0)) КАК Рейтинг
ПОМЕСТИТЬ втРейтинги
ИЗ
втДанныеПоКоличеству КАК втДанныеПоКоличеству
ЛЕВОЕ СОЕДИНЕНИЕ втДанныеПоКоличеству КАК втДанныеПоКоличествуРейтинг
ПО втДанныеПоКоличеству.Номенклатура <> втДанныеПоКоличествуРейтинг.Номенклатура
И втДанныеПоКоличеству.Количество > втДанныеПоКоличествуРейтинг.Количество

СГРУППИРОВАТЬ ПО
втДанныеПоКоличеству.Номенклатура,
втДанныеПоКоличеству.Количество

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
втДанныеПоКоличеству.Номенклатура,
втДанныеПоКоличеству.Количество,
СУММА(ЕСТЬNULL(втДанныеПоКоличествуРейтинг.Элемент,0))
ИЗ
втДанныеПоКоличеству КАК втДанныеПоКоличеству
ЛЕВОЕ СОЕДИНЕНИЕ втДанныеПоКоличеству КАК втДанныеПоКоличествуРейтинг
ПО втДанныеПоКоличеству.Номенклатура <> втДанныеПоКоличествуРейтинг.Номенклатура
И втДанныеПоКоличеству.Количество = втДанныеПоКоличествуРейтинг.Количество
И втДанныеПоКоличеству.Номенклатура.Наименование > втДанныеПоКоличествуРейтинг.Номенклатура.Наименование

СГРУППИРОВАТЬ ПО
втДанныеПоКоличеству.Номенклатура,
втДанныеПоКоличеству.Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втРейтинги.Номенклатура КАК Номенклатура,
втРейтинги.Количество КАК Количество,
СУММА(втРейтинги.Рейтинг) КАК Рейтинг
ПОМЕСТИТЬ втРезультат
ИЗ
втРейтинги КАК втРейтинги

СГРУППИРОВАТЬ ПО
втРейтинги.Номенклатура,
втРейтинги.Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втРезультат.Номенклатура КАК Номенклатура,
втРезультат.Количество КАК Количество,
втКоличествоЭлементов.КоличествоЭлементов - втРезультат.Рейтинг КАК Рейтинг
ИЗ
втРезультат КАК втРезультат,
втКоличествоЭлементов КАК втКоличествоЭлементов

УПОРЯДОЧИТЬ ПО
Рейтинг
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ втДанныеПоКоличеству
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ втКоличествоЭлементов
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ втРезультат
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ втРейтинги

Но нам необходимо сделать еще и по группам номенклатуры.

Задачу разбиваем на две части:

1. формирование данных без рейтингов

2. пересчет и формирование отчета этого же отчета с уже рассчитанными рейтингами.

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

 

 Формирование отчета для расчета рейтингов

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка            = Ложь;

//Получаем схему из макета
СхемаКомпоновкиДанных       = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

//Из схемы возьмем настройки по умолчанию
НастройкиПоУмолчанию            = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();

ВременнаяТаблицаЗначений        = Новый ТаблицаЗначений;
ВременнаяТаблицаЗначений.Колонки.Добавить("Номенклатура");
ВременнаяТаблицаЗначений.Колонки.Добавить("Значение");
ВременнаяТаблицаЗначений.Колонки.Добавить("Уровень");

МассивРейтингов                 = Новый Массив(6);
Для А=1 по 6 Цикл
МассивРейтингов[А-1]        = ВременнаяТаблицаЗначений.Скопировать();
НастройкиПоУмолчанию.ПараметрыДанных.УстановитьЗначениеПараметра("Рейтинг"+Сокрлп(А)        ,Новый ХранилищеЗначения(Новый СписокЗначений));
КонецЦикла;

//эти поля нужны для расчета
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"Количество");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"Стоимость");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"Выручка");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"РейтингКоличество");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"РейтингСтоимость");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"РейтингВыручка");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"РейтингВГруппеКоличество");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"РейтингВГруппеСтоимость");
ДобавитьПоле(НастройкиПоУмолчанию.Выбор.Элементы,"РейтингВГруппеВыручка");  

Затем обрабатываем полученные данные и на выходе получаем массив рейтингов.

В примере получаю три рейтинга: количество, стоимость, выручка и три рейтинга по группам (рейтинги по группам строится внутри одной группы)

 

 Обработка дерева с данными и получение рейтингов

 

    ОбработатьДерево(ДеревоРезультат,МассивРейтингов);

Для А=0 По 2 Цикл
Временная               = МассивРейтингов[А].Скопировать();
Временная.Сортировать("Значение Убыв, Уровень Возр");
МассивРейтингов[А].Очистить();
ДобавитьРейтинги(Временная   ,МассивРейтингов[А]);
КонецЦикла;

//Из схемы возьмем настройки по умолчанию
НастройкиПоУмолчанию        = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();

Для А=1 по 6 Цикл
НастройкиПоУмолчанию.ПараметрыДанных.УстановитьЗначениеПараметра("Рейтинг"+Сокрлп(А)        ,Новый ХранилищеЗначения(ТаблицуВСписокЗначения(МассивРейтингов[А-1])));
КонецЦикла;

 

Чтобы получить данные по рейтингам в ресурсах, добавим общий модуль с функцией ПолучитьРейтинг(Номенклатура,Рейтинг) и пропишем ее в настройках СКД.

В параметрах отчета добавляем параметры (рейтинг1,2,3,4,5,6) с типом значения "ХранилищеЗначения", куда будем помещать данные по рейтингам.

После этого мы формируем отчет с уже заданными рейтингами.

В результате получаем отчет следующего вида:

Возможно, для данной задачи кто-то знает и другое решение.

Тестовый отчет тестировался в демонстрационной базе конфигурации УТ 11.4 на платформе 8.3.13.1690.

 

Возможно вас заинтересуют другие публикации:

 

  Структура компании. Такого нигде не увидите.

  Схемы показателей. Объединение наборов СКД.

  Групповая отправка документов по электронной почте.

  Подсистема "Согласование документов с произвольным маршрутом"

  Подсистема "Произвольные формы ввода"

2 Comments

  1. psih12

    А если нужен рейтинг по этим трем показателям, но только внутри каждой группировки? Как будет выглядеть запрос?

    Reply
  2. MaxxiMiliSan

    (1) это уже реализовано в отчёте, который можете скачать

    Reply

Leave a Comment

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