Книга знаний

1С:Предприятие / Объекты конфигурации / Отчеты

Рекурсивный вывод группировок отчета

Заготовка для отчета с выбором отображаемых группировок и ресурсов.Автор статьи: romix | Редакторы:
Последняя редакция №2 от 14.11.06 | История
URL: http://kb.mista.ru/article.php?id=412

Ключевые слова: отчет, запрос, настройка, рекурсивный


На форме у меня расположены два списка значений с пометками (галочками).
(Правый клик - Свойства - Дополнительно - Список с пометками).

ф_сз - названия группировок отчета.
ф_сз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 Тогда
        Предупреждение("Укажите хотя бы одну группировку");
        Возврат;
    КонецЕсли;



Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика