Динамический отчет на СКД с разными вариантами На днях делал несколько однотипных отчетов на СКД.
Общий принцип: формируются все варианты отчета, указанные в настройках схемы и каждый вариант выводится на отдельной вкладке.
Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.
В тестовой конфигурации создаю для отчета две схемы компоновки, "Склад" и "Заявки".
Запросы наборов данных приводить не буду, для каждой схемы в настройках добавляю несколько вариантов отчетов.
Теперь переходим к созданию формы. Практически все реквизиты формы будут создаваться при выборе необходимого макета отчета.
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьПереченьОтчетов()
Для Каждого Макет Из РеквизитФормыВЗначение("Отчет").Метаданные().Макеты Цикл
Элементы.МакетОтчета.СписокВыбора.Добавить(Макет.Имя, Макет.Синоним);
КонецЦикла;
КонецПроцедуры // СоздатьПереченьОтчетов()
&НаСервере
Процедура ОбработатьВыборМакета()
Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет(МакетОтчета);
мУдалить = ?(ПустаяСтрока(РеквизитыКУдалению), Новый Массив, ПолучитьИзВременногоХранилища(РеквизитыКУдалению));
мДобавить = Новый Массив;
кУдалению = Новый Массив;
Для Каждого Вариант Из Макет.ВариантыНастроек Цикл
ИмяРеквизита = "ТабДок_" + Вариант.Имя;
тРеквизит = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("ТабличныйДокумент"));
мДобавить.Добавить(тРеквизит);
кУдалению.Добавить(ИмяРеквизита);
КонецЦикла;
ИзменитьРеквизиты(мДобавить, мУдалить);
Пока Элементы.СтраницыОтчета.ПодчиненныеЭлементы.Количество() Цикл
Элементы.Удалить(Элементы.СтраницыОтчета.ПодчиненныеЭлементы[0]);
КонецЦикла;
Для Каждого Вариант Из Макет.ВариантыНастроек Цикл
Страница = Элементы.Добавить("Страница_" + Вариант.Имя, Тип("ГруппаФормы"), Элементы.СтраницыОтчета);
Страница.Вид = ВидГруппыФормы.Страница;
Страница.Заголовок = Вариант.Представление;
ИмяРеквизита = "ТабДок_" + Вариант.Имя;
ТабДок = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Страница);
ТабДок.Вид = ВидПоляФормы.ПолеТабличногоДокумента;
ТабДок.ПутьКДанным = ИмяРеквизита;
ТабДок.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ЭтаФорма[ИмяРеквизита].Очистить();
КонецЦикла;
РеквизитыКУдалению = ПоместитьВоВременноеХранилище(кУдалению, УникальныйИдентификатор);
КонецПроцедуры // ОбработатьВыборМакета()
&НаСервере
Процедура СформироватьОтчеты()
Схема = РеквизитФормыВЗначение("Отчет").ПолучитьМакет(МакетОтчета);
Для Каждого Вариант Из Схема.ВариантыНастроек Цикл
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Отчет.КомпоновщикНастроек.ПолучитьНастройки());
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭтаФорма["ТабДок_" + Вариант.Имя]);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецЦикла;
КонецПроцедуры // СформироватьОтчеты()
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СоздатьПереченьОтчетов();
КонецПроцедуры
&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)
ОбработатьВыборМакета();
КонецПроцедуры
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьОтчеты();
КонецПроцедуры
Смотрим, что получилось.
Выгрузка базы 1Cv8skd.rar
Источник
Категория:
Схема Компоновки Данных