Универсальный многомерный отчёт, с использованием любой произвольной комбинации группировок по внутренним переменным запроса 1С 7.7
Многомерный отчёт универсальный.zip
Очень часто приходится анализировать информацию под различными срезами – Товар-Покупатель, Покупатель-Товар и т.д. В стандартных отчетах 1С, это производится многочисленными конструкциями типа:
1 2 3 |
Если ГруппировкаПоТовар = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Группировка Товар;" КонецЕсли; |
Где Товар – внутренняя переменная запроса…
Данная конструкция прекрасно работает там, где практический интерес представляют группировки по ограниченному (очень ограниченному) числу внутренних переменных запроса. В случае же, когда необходим анализ большего количества срезов, накопленной в запросе информации, ограничиваются частными случаями. Для примера- вспомните мат. анализ и выведите количество ВСЕХ комбинаций группировок для десяти переменных запроса. При условии, что мы ограничимся трехмерным отчетом.
Ниже приводится вариант решения этой задачи.
В регистре УпрУчет, накоплена информация о деятельности фирмы. Любое движение регистра производилось в разрезе критериев, служащих для дальнейшей оценки работы фирмы.
Строим отчет по трём измерениям.
Формируем запрос…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ТекстЗапроса = ТекстЗапроса +" |Сотрудник = Регистр.УпрУчет.Сотрудник; |Модель = Регистр.УпрУчет.Модель; |Регион = Регистр.УпрУчет.Регион; |НапрДеятельности = Регистр.УпрУчет.НапрДеятельности; |Подразделение = Регистр.УпрУчет.Сотрудник.Подразделение; |ВидыУпрРасходов = Регистр.УпрУчет.ВидыУпрРасходов; // |Док=Регистр.УпрУчет.ТекущийДокумент; // |СуммаРасх = Регистр.УпрУчет.СуммаЗатрат; |СуммаДох = Регистр.УпрУчет.СуммаДохода; //|Функция СумДох=Приход(СуммаДох); //|Функция СумДохМинус=Расход(СуммаДох); // |Условие(Сотрудник в ВыбСотрудник); |Условие(Подразделение в ВыбПодразделение); |Условие(НапрДеятельности в ВыбНапрДеятельности); |Условие(Модель в ВыбМодель); |Условие(ВидыУпрРасходов в ВыбЗатраты); |Условие(Регион в ВыбРегион); |";//}}ЗАПРОС |
Предварительно, вначале, заполняем элементы диалога (списки значений) Срез1, Срез2, Срез3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Срез1.ДобавитьЗначение("НапрДеятельности", "Направлениям"); Срез1.ДобавитьЗначение("Сотрудник", "Сотрудникам"); Срез1.ДобавитьЗначение("Модель", "Маркам"); Срез1.ДобавитьЗначение("Подразделение", "Подразделениям"); Срез1.ДобавитьЗначение("ВидыУпрРасходов", "Видам расходов"); Срез1.ДобавитьЗначение("Регион", "Регионам"); // Срез2.ДобавитьЗначение(0, "Нет второго уровня"); Срез2.ДобавитьЗначение("НапрДеятельности", "Направлениям"); Срез2.ДобавитьЗначение("Сотрудник", "Сотрудникам"); Срез2.ДобавитьЗначение("Модель", "Маркам"); Срез2.ДобавитьЗначение("Подразделение", "Подразделениям"); Срез2.ДобавитьЗначение("ВидыУпрРасходов", "Видам расходов"); Срез2.ДобавитьЗначение("Регион", "Регионам"); // Срез3.ДобавитьЗначение(0, "Нет третьего уровня"); Срез3.ДобавитьЗначение("НапрДеятельности", "Направлениям"); Срез3.ДобавитьЗначение("Сотрудник", "Сотрудникам"); Срез3.ДобавитьЗначение("Модель", "Маркам"); Срез3.ДобавитьЗначение("Подразделение", "Подразделениям"); Срез3.ДобавитьЗначение("ВидыУпрРасходов", "Видам расходов"); Срез3.ДобавитьЗначение("Регион", "Регионам"); |
Значение в списке «Срез-N» должно соответствовать имени переменной запроса.
Блок группировок формируем так…..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Ср1 = Срез1.ПолучитьЗначение(Срез1.ТекущаяСтрока(), Ср1Текст); Ср2 = Срез2.ПолучитьЗначение(Срез2.ТекущаяСтрока(), Ср2Текст); Ср3 = Срез3.ПолучитьЗначение(Срез3.ТекущаяСтрока(), Ср3Текст); ТекстЗапроса = ТекстЗапроса + " |Группировка " + ср1 + " упорядочить по " + ср1 + ".ТекущийЭлемент;"; Если Ср2 <> 0 Тогда ТекстЗапроса = ТекстЗапроса + " |Группировка " + ср2 + " упорядочить по " + ср2 + ".ТекущийЭлемент;"; КонецЕсли; Если Ср3 <> 0 Тогда ТекстЗапроса = ТекстЗапроса + " |Группировка " + ср3 + " упорядочить по " + ср3 + ".ТекущийЭлемент;"; КонецЕсли; Если Фл_Подробно = 1 Тогда ТекстЗапроса = ТекстЗапроса+" |Группировка Док;"; КонецЕсли; |
Блок формирования печати структурно представлен ниже…..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Пока Запрос.Группировка(1) = 1 Цикл // Первый уровень - обработка Если "" + Ср2 <> "0" Тогда Пока Запрос.Группировка(2) = 1 Цикл // второй уровень - обработка Если "" + Ср3 <> "0" Тогда Пока Запрос.Группировка(3) = 1 Цикл //3-й уровень - обработка КонецЦикла; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; |
Доступ к текущим значениям группировок достигается через выражение:
1 |
Запрос.ЗначениеУпорядочивания(1,1) |