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