Как обычно это делается? На форму добавляется реквизит типа "Табличный документ" (назовем его для конкретики - ТаблицаРезультат) и реквизит типа "КомпоновщикНастроекКомпоновкиДанных" (пусть этот называется - КомпоновщикНастроек). Дальше, если нам, к примеру, нужен отбор, то из реквизита "КомпоновщикНастроек" из раздела "Настройки" на форму вытаскивается таблица "Отбор", ну и так далее.
Затем в форму добавляется процедура "ПриСозданииНаСервере" с таким кодом:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МакетОтчетСКД = ПолучитьОбщийМакет("ОтчетСКД");
АдресМакетаОтчетаСКД = ПоместитьВоВременноеХранилище(МакетОтчетСКД, УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресМакетаОтчетаСКД));
КомпоновщикНастроек.ЗагрузитьНастройки(МакетОтчетСКД.НастройкиПоУмолчанию);
КонецПроцедуры
(где "АдресМакетаОтчетаСКД" - некая общая строковая переменная, которая может передаваться между вызовами сервера, например, тоже реквизит формы)
А дальше при нажатии на кнопку "Сформировать" вызывается серверная процедура примерно с таким кодом:
МакетОтчетСКД = ПолучитьИзВременногоХранилища(АдресМакетаОтчетаСКД);
Настройки=КомпоновщикНастроек.Настройки;
//---Расскомментировать, если нужно установить параметры отчета
//ПараметрОтчета1 = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Параметр1"));
//Если ПараметрОтчета1 <> Неопределено Тогда
// ПараметрОтчета1.Значение = ЗначениеПараметра;
// ПараметрОтчета1.Использование = Истина;
//КонецЕсли;
КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки=Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(МакетОтчетаСКД,Настройки,ДанныеРасшифровки);
ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,ДанныеРасшифровки);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
Причем, обратите внимание на метод "Инициализировать" у компоновщика настроек. Синтакс-помощник пишет, что методу необходимо передавать "ИсточникДоступныхНастроекКомпоновкиДанных", а конструктор объекта этого типа бывает двух видов:
- На основании URL - Создает источник, получающий схему компоновки данных, по переданному URL.
- На основании схемы - Инициализирует источник доступных настроек на основе схемы компоновки данных.
P.S.: Этот пост написан в качестве памятки, и не содержит ничего нового или интересного.
P.P.S.: По материалам треда "Не могу отобразить настройки на форме из реквизита типа КомпоновщикНастроек" с форума 1С.
4 комментария:
Вы просто гений! Это лучший пост в сети про программный вывод СКД!
закралась орфо-ошибка МакетОтчетСКД и МакетОтчетаСКД
Все заработало.
Спасибо, конечно. =)
Но, это, как я уже писал просто закладка для себя.
По поводу СКД лучший сборник рецептов, на мой взгляд, тут: http://1cskd.ru/
(кстати, почему-то сайт лежит :(
Спасибо, помогло.
Но непонятно, почему не отрабатывает (ПриСозданииНаСервере) такая конструкция:
СхемаКомпоновкиДанных = Отчеты.Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Поля отбора появляются на форме, но с красным крестиком
Возможно дело в самой схеме.
Если эти поля в наборах данных?
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.