Книга знаний

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

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

Заготовка для отчета с выбором отображаемых группировок и ресурсов.Автор статьи: romix | Редакторы:
Последняя редакция №5 от 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 Тогда
        Предупреждение("Укажите хотя бы одну группировку");
        Возврат;
    КонецЕсли;



Чтобы списки значений с выбранными галочками сохранялись, поставьте спискам значений признак "Сохранять при сохранении настройки".


Заполнение списка группировками



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


Как сделать, чтобы списки значений сохранялись


Правый клик - Свойства - Общие - Сохранять при сохранении настройки

Изменение порядка группировок



Положите на форму кнопки "вверх" и "вниз" с обработчиками:

///////////////////////////////////////////////////////////////////////
Процедура ф_Вверх()
    ф_сз.СдвинутьЗначение(-1,ф_сз.ТекущаяСтрока());
КонецПроцедуры

///////////////////////////////////////////////////////////////////////
Процедура ф_Вниз()
    ф_сз.СдвинутьЗначение(1,ф_сз.ТекущаяСтрока());
КонецПроцедуры



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

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