Книга знаний

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

Тупой способ написания многоуровневых отчетов

Быстрый и лобовой подход для написания многоуровневых отчетовАвтор статьи: Гений 1С | Редакторы:
Последняя редакция №2 от 12.07.06 | История
URL: http://kb.mista.ru/article.php?id=285

Иногда лень использовать построитель и хочется быстренько набросать вывод многоуровневого отчета, где все под контролем.
Изюминка отчета - цикл с продвижением и отложенный вывод строк.

 
  ИндП=0;
    ТД.Сортировать("Подразделение,Отдел,Сотрудник"); //Обязательно сортировка   
    ОблИ=Макет.ПолучитьОбласть("Итог");

    Строки=Новый Массив();
    Пока ИндП<ТД.Количество() Цикл
        ИндО=ИндП;
        
        Стр=ТД[ИндП];
        ОблП=Макет.ПолучитьОбласть("Подразделение");
        ОблП.Параметры.Подразделение = Стр.Подразделение;
        Строки.Добавить(ОблП);
        

        Пока ИндО <ТД.Количество() Цикл
            Если ТД[ИндО].Подразделение<>ТД[ИндП].Подразделение Тогда
                Прервать;
            КонецЕсли;
            
            Стр=ТД[ИндО];
            ОблО=Макет.ПолучитьОбласть("Отдел");
            ОблО.Параметры.Отдел = Стр.Отдел;
            ОблО.Параметры.Начальник = Стр.Начальник;
            ОблО.Параметры.ФондНачальника = Стр.ФондНачальника;
            Строки.Добавить(ОблО);
            
            ИндС=ИндО;
            Пока ИндС < ТД.Количество() Цикл
                Если ТД[ИндС].Отдел<>ТД[ИндО].Отдел Тогда
                    Прервать;
                КонецЕсли;
                СтрСотрудник=ТД[ИндС];
                облСтрока = Макет.ПолучитьОбласть("Сотрудник");
                            облСтрока.Параметры.Сотрудник = СтрСотрудник.Сотрудник;
                облСтрока.Параметры.ДатаПриема = Формат(СтрСотрудник.Сотрудник.ДатаПриема,"ДФ=dd.MM.yy");
                облСтрока.Параметры.Долг = СтрСотрудник.Долг;
                облСтрока.Параметры.Фонд = СтрСотрудник.Фонд;
                Строки.Добавить(облСтрока);
                
                ОблО.Параметры.Долг=ТолькоЧисло(ОблО.Параметры.Долг)+ТолькоЧисло(СтрСотрудник.Долг);
                ОблО.Параметры.Фонд=ТолькоЧисло(ОблО.Параметры.Фонд)+ТолькоЧисло(СтрСотрудник.Фонд);
                
                ОблП.Параметры.Долг=ТолькоЧисло(ОблП.Параметры.Долг)+ТолькоЧисло(СтрСотрудник.Долг);
                ОблП.Параметры.Фонд=ТолькоЧисло(ОблП.Параметры.Фонд)+ТолькоЧисло(СтрСотрудник.Фонд);
                
                ОблИ.Параметры.Долг=ТолькоЧисло(ОблИ.Параметры.Долг)+ТолькоЧисло(СтрСотрудник.Долг);
                ОблИ.Параметры.Фонд=ТолькоЧисло(ОблИ.Параметры.Фонд)+ТолькоЧисло(СтрСотрудник.Фонд);
                
                ИндС=ИндС+1;
            КонецЦикла;
            ИндО=ИндС;
        КонецЦикла;
        ИндП=ИндО;
    КонецЦикла;

    Строки.Добавить(ОблИ);

    Для Каждого Обл из Строки Цикл
        Таб.Вывести(Обл);
    КонецЦикла;


Функция ТолькоЧисло - возвращает 0, если это не число и число, если это число.
Лучше использовать не переменные ИндП,ИндО,ИндС, а Инд1,Инд2,Инд3, тогда просто можно менять местами группировки.
Обсуждение: v8: Просто красивый код. Строит красивый отчет.
Закладка

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

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