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

Публикация № 998634

Программирование - Практика программирования

Отчет СКД нумерация программное формирование отчета выгрузка данных. ХранилищеЗначений в СКД. рейтинг параметры

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

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

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

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

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

Реализовывать отчет можно в любой конфигурации и с любыми данными. Для примера я взял УТ 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.

5

Скачать файлы

Наименование Файл Версия Размер
СквознойРейтинг
.7z 13,08Kb
07.02.19
0
.7z 1.1.1 13,08Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. psih12 123 07.02.19 21:52 Сейчас в теме
А если нужен рейтинг по этим трем показателям, но только внутри каждой группировки? Как будет выглядеть запрос?
2. MaxxiMiliSan 34 07.02.19 22:09 Сейчас в теме
(1) это уже реализовано в отчёте, который можете скачать
Оставьте свое сообщение