Тупой способ написания многоуровневых отчетов Иногда лень использовать построитель и хочется быстренько набросать вывод многоуровневого отчета, где все под контролем.
Изюминка отчета - цикл с продвижением и отложенный вывод строк.
ИндП=0;
ТД.Сортировать("Подразделение,Отдел,Сотрудник"); //Обязательно сортировка
ОблИ=Макет.ПолучитьОбласть("Итог");
Строки=Новый Массив();
Пока ИндП<ТД.Количество() Цикл
ИндО=ИндП;
Стр=ТД[ИндП];
ОблП=Макет.ПолучитьОбласть("Подразделение");
ОблП.Параметры.Подразделение = Стр.Подразделение;
Строки.Добавить(ОблП);
Пока ИндО <ТД.Количество() Цикл
Если ТД[ИндО].Подразделение<>ТД[ИндП].Подразделение Тогда
Прервать;
КонецЕсли;
Стр=ТД[ИндО];
ОблО=Макет.ПолучитьОбласть("Отдел");
ОблО.Параметры.Отдел = Стр.Отдел;
ОблО.Параметры.Начальник = Стр.Начальник;
ОблО.Параметры.ФондНачальника = Стр.ФондНачальника;
Строки.Добавить(ОблО);
ИндС=ИндО;
Пока ИндС < ТД.Количество() Цикл
Если ТД[ИндС].Отдел<>ТД[ИндО].Отдел Тогда
Прервать;
КонецЕсли;
СтрСотрудник=ТД[ИндС];
облСтрока = Макет.ПолучитьОбласть("Сотрудник");
облСтрока.Параметры.Сотрудник = СтрСотрудник.Сотрудник;
облСтрока.Параметры.ДатаПриема = Формат(СтрСотрудник.Сотрудник.ДатаПриема,"ДФ=dd.MM.yy");
облСтрока.Параметры.Долг = СтрСотрудник.Долг;
облСтрока.Параметры.Фонд = СтрСотрудник.Фонд;
Строки.Добавить(облСтрока);
ОблО.Параметры.Долг=ТолькоЧисло(ОблО.Параметры.Долг)+ТолькоЧисло(СтрСотрудник.Долг);
ОблО.Параметры.Фонд=ТолькоЧисло(ОблО.Параметры.Фонд)+ТолькоЧисло(СтрСотрудник.Фонд);
ОблП.Параметры.Долг=ТолькоЧисло(ОблП.Параметры.Долг)+ТолькоЧисло(СтрСотрудник.Долг);
ОблП.Параметры.Фонд=ТолькоЧисло(ОблП.Параметры.Фонд)+ТолькоЧисло(СтрСотрудник.Фонд);
ОблИ.Параметры.Долг=ТолькоЧисло(ОблИ.Параметры.Долг)+ТолькоЧисло(СтрСотрудник.Долг);
ОблИ.Параметры.Фонд=ТолькоЧисло(ОблИ.Параметры.Фонд)+ТолькоЧисло(СтрСотрудник.Фонд);
ИндС=ИндС+1;
КонецЦикла;
ИндО=ИндС;
КонецЦикла;
ИндП=ИндО;
КонецЦикла;
Строки.Добавить(ОблИ);
Для Каждого Обл из Строки Цикл
Таб.Вывести(Обл);
КонецЦикла;
Функция ТолькоЧисло - возвращает 0, если это не число и число, если это число.
Лучше использовать не переменные ИндП,ИндО,ИндС, а Инд1,Инд2,Инд3, тогда просто можно менять местами группировки.
Обсуждение: v8: Просто красивый код. Строит красивый отчет. |