В процессе работы с СКД часто приходится сталкиваться с необходимостью использования двух схем компоновки данных. При подготовке одного из таких отчетов столкнулась с проблемой, как вывести на форму не только сам отчет по схеме, но и настройки (отборы/параметры) именно для той схемы, которая сейчас используется.
Далее приведен простейший пример такого отчета.
Отчет по продажам с группировками по месяцам и неделям.
1. Создаем внешний отчет.
2. В отчете создаем основную схему компоновки данных с набором данных - Запрос.
Текст запроса:
ВЫБРАТЬ ПродажиОбороты.Склад, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот, КОНЕЦПЕРИОДА(ПродажиОбороты.Период, МЕСЯЦ) КАК Период ИЗ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
3. Настраиваем ресурсы и внешний вид отчета
4. Создаем дополнительную схему компоновки данных с набором данных - Запрос.
Текст запроса:
ВЫБРАТЬ ПродажиОбороты.Склад, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот, КОНЕЦПЕРИОДА(ПродажиОбороты.Период, НЕДЕЛЯ) КАК Период ИЗ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
И аналогичным образом задаем ресурсы и внешний вид.
5. Создаем основную форму отчета с помощью конструктора форм.
6. В форме необходимо добавить возможность переключения между схемами. Для этого добавим команду - Выбрать период и реквизит - ИмяТекущейСхемы
7. Команда "ВыбратьПериод"
&НаСервере Процедура ВыбратьПериодНаСервере(ИмяТекущейСхемы) СформироватьОтчет(ИмяТекущейСхемы); КонецПроцедуры &НаКлиенте Процедура ВыбратьПериод(Команда) Список = Новый СписокЗначений; Список.Добавить("ОсновнаяСхемаКомпоновкиДанных", "МЕСЯЦ"); Список.Добавить("ОсновнаяСхемаКомпоновкиДанных1", "НЕДЕЛЯ"); ВыбЭлемент = Список.ВыбратьЭлемент().Значение; ИмяТекущейСхемы = ВыбЭлемент; ВыбратьПериодНаСервере(ИмяТекущейСхемы); КонецПроцедуры
8. Далее необходимо прописать код команды "СформироватьОтчет"
&НаСервере Процедура СформироватьОтчет(ВыбЭлемент) ТекОб = РеквизитФормыВЗначение("Отчет"); Если ЗначениеЗаполнено(ВыбЭлемент) Тогда ТекОб.СхемаКомпоновкиДанных = ТекОб.ПолучитьМакет(ВыбЭлемент); КонецЕсли; //Установим настройки Настройки = ТекОб.КомпоновщикНастроек.ПолучитьНастройки(); ТекОб.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); //Формируем макет, с помощью компоновщика макета КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; //Передаем в макет компоновки схему, настройки и данные расшифровки МакетКомпоновки = КомпоновщикМакета.Выполнить( ТекОб.СхемаКомпоновкиДанных,Настройки); //Выполним компоновку с помощью процессора компоновки ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки); //Очищаем поле табличного документа Результат.Очистить(); //Выводим результат в табличный документ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры
Прокомментирую данный код.
В первую очередь получаем необходимую схему компоновки данных, в зависимости от выбранного периода и соответственно переданного в процедуру параметра.
Если ЗначениеЗаполнено(ВыбЭлемент) Тогда ТекОб.СхемаКомпоновкиДанных = ТекОб.ПолучитьМакет(ВыбЭлемент); КонецЕсли
Далее считываем текущие настройки схемы. На этот код советую обратить внимание, так как при считывании настроек по умолчанию отчет всегда будет формироваться так, как указано в конфигураторе, независимо от данных на форме
Настройки = ТекОб.КомпоновщикНастроек.ПолучитьНастройки(); ТекОб.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки)
После идет формирование и вывод отчета в поле формы "Результат".
9. Заменяем стандартную процедуру формирования отчета нашей процедурой и выводим ее на форму
&НаКлиенте Процедура Сформировать(Команда) СформироватьОтчет(ИмяТекущейСхемы) КонецПроцедуры
10. Для параметров и отборов устанавливаем флаг "Включать в пользовательские настройки"
Проверяем результат