Постановка задачи
Все наверняка сталкивались с таким понятием, как ABC—анализ.
ABC—анализ— метод, позволяющий классифицировать ресурсы фирмы по степени их важности. Этот анализ является одним из методов рационализации и может применяться в сфере деятельности любого предприятия.
Возникла необходимость реализовать такой отчет.
Особенностью данного отчета является то, что наборы данных описываются схемами компоновки данных, которые хранятся в справочнике.
Ниже приведена часть этого отчета, в которой рассматривается принцип построения отчета на основании нескольких схем компоновки данных.
Описание
Для демонстрации работы отчета добавим объекты в пустую конфигурацию:

Справочник "Номенклатура" — это объект для анализа.
Справочник "Показатели Анализа" — справочник, который будет хранить СКД с расчетом показателей.

Заведем пару показателей: "Количество продаж" и "Сумму продаж" и загрузим в них СКД.
Текст запроса наборов будет примерно следующего вида:
ВЫБРАТЬ
РегистрАнализа.Номенклатура КАК Объект,
РегистрАнализа.КоличествоОборот КАК ПоказательАнализа
ПОМЕСТИТЬ ОригинальныйЗапрос
ИЗ
РегистрНакопления.РегистрАнализа.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, , {(Номенклатура)}) КАК РегистрАнализа
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОригинальныйЗапрос.Объект КАК Объект,
ОригинальныйЗапрос.ПоказательАнализа КАК ПоказательАнализа,
ВЫБОР
КОГДА ЕСТЬNULL(ИтогиТаблицы.ПоказательИтог, 0) > 0
ТОГДА ОригинальныйЗапрос.ПоказательАнализа / ИтогиТаблицы.ПоказательИтог * 100
ИНАЧЕ 0
КОНЕЦ КАК ДоляПоказателяАнализа
ПОМЕСТИТЬ ДолиОборотов
ИЗ
ОригинальныйЗапрос КАК ОригинальныйЗапрос,
(ВЫБРАТЬ
СУММА(ОригинальныйЗапрос.ПоказательАнализа) КАК ПоказательИтог
ИЗ
ОригинальныйЗапрос КАК ОригинальныйЗапрос) КАК ИтогиТаблицы
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДолиОборотов.Объект КАК Объект,
ДолиОборотов.ДоляПоказателяАнализа КАК ДоляПоказателяАнализа,
ДолиОборотов.ПоказательАнализа КАК ПоказательАнализа,
СУММА(ЕСТЬNULL(ДолиОборотов1.ДоляПоказателяАнализа, 0)) + ДолиОборотов.ДоляПоказателяАнализа КАК ДоляНакопительная
ИЗ
ДолиОборотов КАК ДолиОборотов
ЛЕВОЕ СОЕДИНЕНИЕ ДолиОборотов КАК ДолиОборотов1
ПО ДолиОборотов.Объект <> ДолиОборотов1.Объект
И (ДолиОборотов.ДоляПоказателяАнализа < ДолиОборотов1.ДоляПоказателяАнализа
ИЛИ ДолиОборотов.ДоляПоказателяАнализа = ДолиОборотов1.ДоляПоказателяАнализа
И ДолиОборотов.Объект > ДолиОборотов1.Объект)
СГРУППИРОВАТЬ ПО
ДолиОборотов.Объект,
ДолиОборотов.ДоляПоказателяАнализа,
ДолиОборотов.ПоказательАнализа
Заведем документ, который будет формировать движения для анализа.

Создадим несколько документов и проведем их.
Отчет "Анализ показателей"

В правой части отчета находится таблица, в которой можно указать показатели анализа и период для данного показателя.
После добавления очередного показателя происходит процесс переформирования СКД. Сразу же становятся доступны настройки объединенного отчета с возможностью добавить отборы или выбрать необходимые поля.
В первом примере выбраны данные по количеству продаж за 3 разных периода.

Во втором примере изменен третий показатель на сумму продаж.

&НаСервере
Процедура СоздатьОтчетНаСервере()
_ПоказателиАнализа = РеквизитФормыВЗначение("ПоказателиАнализа");
_ПоказателиАнализа.Колонки.Добавить("СКД");
КоличествоПоказателейАнализа = _ПоказателиАнализа.Количество();
Для А=1 по КоличествоПоказателейАнализа Цикл
Строка =_ПоказателиАнализа.Получить(КоличествоПоказателейАнализа-А);
СКДВременный = ПолучитьСКД(Строка.Значение);
Если СКДВременный<>Неопределено тогда
Строка.СКД = СКДВременный;
Иначе
_ПоказателиАнализа.Удалить(Строка);
КонецЕсли;
КонецЦикла;
Если _ПоказателиАнализа.Количество()=0 Тогда
Возврат;
КонецЕсли;
ОбъектАнализа = ПоказателиАнализа[0].Значение.Наименование;
//Источник
СКД = Новый СхемаКомпоновкиДанных;
ИсточникиДанных = СКД.ИсточникиДанных.Добавить();
ИсточникиДанных.Имя = "Local";
ИсточникиДанных.ТипИсточникаДанных = "Local";
НаборДанныхОбщий = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных"));
НаборДанныхОбщий.Имя = "НаборОбъединение";
НастройкиКомпоновкиДанных = СКД.НастройкиПоУмолчанию;
//Выбранные поля
НастройкиКомпоновкиДанных.Выбор.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "Объект анализа";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Объект");
//Группировка
ГруппировкаОъекта = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеКонтрагент = ГруппировкаОъекта.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеКонтрагент.Использование = Истина;
ПолеКонтрагент.Поле = Новый ПолеКомпоновкиДанных("Объект");
АвтоПоле = ГруппировкаОъекта.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;
//Сортировка
НастройкиКомпоновкиДанных.Порядок.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
//Отбор
НастройкиКомпоновкиДанных.Отбор.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
НастройкиКомпоновкиДанных.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов" ,РасположениеИтоговКомпоновкиДанных.Нет);
НастройкиКомпоновкиДанных.ПараметрыВывода.УстановитьЗначениеПараметра("ГоризонтальноеРасположениеОбщихИтогов" ,РасположениеИтоговКомпоновкиДанных.Нет);
НастройкиКомпоновкиДанных.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьПараметрыДанных" ,ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
НовыйЭлементОтбора = НастройкиКомпоновкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект");
НовыйЭлементОтбора.Использование = Ложь;
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
НовыйЭлементОтбора.ИдентификаторПользовательскойНастройки=Новый УникальныйИдентификатор;
Для Каждого ПоказательАнализа Из _ПоказателиАнализа Цикл
ОбъединениеСКД(СКД,НаборДанныхОбщий,НастройкиКомпоновкиДанных,ПоказательАнализа);
КонецЦикла;
АдресСхемы = ПоместитьВоВременноеХранилище(СКД, УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);
КонецПроцедуры
Проверялось на платформе 8.3.13.1690.
Возможно вас заинтересуют другие публикации:
Структура компании. Такого нигде не увидите.
Схемы показателей. Объединение наборов СКД.
Групповая отправка документов по электронной почте.
Подсистема "Согласование документов с произвольным маршрутом"
Подсистема "Произвольные формы ввода"