Добрый день! Представляю вашему вниманию пример реализации отчета кросс-таблицы с иерархией и жестко заданной структурой вывода на примере двух отчетов для БП 3.0:
1. ДДС по месяцам и кварталам (Простой отчет);
2. ДДС по счетам в разрезе валют (Сложный отчет).
Предпосылки:
В моей практике часто приходилось создавать подобные отчеты для финансового отдела, однако, первые реализации занимали у меня много времени, но по факту данный отчет без учета реализации жестко заданного шаблона является простым и легко реализуется на СКД.
Так как разработать данный отчет только с использованием СКД не является возможным из-за жестко заданной структуры вывода, я разработал шаблон отчета из симбиоза СКД и программного вывода в табличный документ, о котором пойдет речь далее.
Несмотря на то, что данный шаблон является своего рода "велосипедом", на моей практике он помогал мне на порядок минимизировать трудозатраты и реализовывать достаточно сложные отчеты.
Основной алгоритм разработанного шаблона:
1. Разработка схемы компоновки данных;
2. Вывод данных в дерево значений;
3. Создание нового дерева значений с нужными колонками кросс-таблицы;
4. Заполнение кросс-таблицы на основании дерева значений СКД;
5. Вывод кросс-таблицы в табличный документ.
1. Схема компоновки данных для отчета ДДС по месяцам и кварталам.
Схема компоновки данных для разрабатываемого отчета, последний уровень группировки будет преобразован в столбцы в кросс-таблице.
1.2 Схема компоновки данных по счетам в разрезе валют (Сложный отчет).
Этот вариант отчета выводит данные по всем организациям, по счетам БУ 50,51,52,55 с горизонтальными итогами в разрезе регламентированной валюты.
Основными удобствами при использовании шаблона является удобная программная структура, позволяющая разрабатывать сложный отчет различными способами, а также процедуры представленные ниже:
1. Процедура заполнения кросс-таблицы на основание дерева значений.
Процедура ЗаполнитьДанныеОтчетаРекурсивно(ДанныеКомпоновкиДанныхСтроки, ОсновнаяТаблица, СтруктураВывода)
Для каждого ДанныеКомпоновкиДанныхСтрока Из ДанныеКомпоновкиДанныхСтроки.Строки Цикл
Если ЗначениеЗаполнено(ДанныеКомпоновкиДанныхСтрока.ПериодМесяц) Тогда
ИмяКолонкиМесяца = ПредставлениеМесяца(ДанныеКомпоновкиДанныхСтрока.ПериодМесяц);
СуммаОборот = ДанныеКомпоновкиДанныхСтрока.СуммаОборот;
УстновитьЗначениеРеквизитаРодителяРекурсивно(ОсновнаяТаблица, ИмяКолонкиМесяца, СуммаОборот);
УстновитьЗначениеРеквизитаРодителяРекурсивно(ОсновнаяТаблица, "Итого", СуммаОборот);
Иначе
НСтр = ОсновнаяТаблица.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НСтр, ДанныеКомпоновкиДанныхСтрока);
Если ЗначениеЗаполнено(ДанныеКомпоновкиДанныхСтрока.Контрагент) Тогда
НСтр.КолонкаГруппировки = ДанныеКомпоновкиДанныхСтрока.Контрагент;
ИначеЕсли ЗначениеЗаполнено(ДанныеКомпоновкиДанныхСтрока.СДДС) Тогда
НСтр.КолонкаГруппировки = ДанныеКомпоновкиДанныхСтрока.СДДС;
ИначеЕсли ЗначениеЗаполнено(ДанныеКомпоновкиДанныхСтрока.ТипДвижения) Тогда
НСтр.КолонкаГруппировки = ДанныеКомпоновкиДанныхСтрока.ТипДвижения;
КонецЕсли;
ЗаполнитьДанныеОтчетаРекурсивно(ДанныеКомпоновкиДанныхСтрока, НСтр, СтруктураВывода);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
2. Процедура, устанавливающая значение ресурса во всех родительских группировках.
Процедура УстновитьЗначениеРеквизитаРодителяРекурсивно(Родитель, ИмяРеквизта, ЗначениеРеквизита)
Если НЕ ЗначениеЗаполнено(Родитель) Или ЗначениеРеквизита = NULL Тогда
Возврат;
КонецЕсли;
Родитель[ИмяРеквизта] = Родитель[ИмяРеквизта] + ЗначениеРеквизита;
УстновитьЗначениеРеквизитаРодителяРекурсивно(Родитель.Родитель, ИмяРеквизта, ЗначениеРеквизита);
КонецПроцедуры
3. Процедура, выполняющая рекурсивный вывод созданной кросс-таблицы в табличный документ.
Процедура ВывестиРекурсивно(ДокументРезультат, СтруктураВывода, Строки, ЗНАЧ Уровень)
Для каждого Эл Из Строки Цикл
Если Эл.Родитель <> Неопределено И Эл.КолонкаГруппировки = Эл.Родитель.КолонкаГруппировки И Эл.Родитель.Строки.Количество() = 1 Тогда
Продолжить;
КонецЕсли;
ЗаполнитьПараметры(ДокументРезультат, СтруктураВывода, Эл, Уровень, );
ДокументРезультат.НачатьГруппуСтрок();
ВывестиРекурсивно(ДокументРезультат, СтруктураВывода, Эл.Строки, Уровень + 1);
ДокументРезультат.ЗакончитьГруппуСтрок();
КонецЦикла;
КонецПроцедуры
Данная обработка тестировалась на 1С:Предприятие 8.3 (8.3.12.1714) в Бухгалтерия предприятия, редакция 3.0 (3.0.43.239).