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