вторник, 28 июня 2011 г.

СКД и отбор на форме

Часто бывает нужно программно сформировать отчет на основании готового макета СКД и вывести его куда-нибудь в поле табличного документа на форме. Еще бывает полезно отобразить на форме настройки отбора или другие настройки СКД.

Как обычно это делается? На форму добавляется реквизит типа "Табличный документ" (назовем его для конкретики - ТаблицаРезультат) и реквизит типа "КомпоновщикНастроекКомпоновкиДанных" (пусть этот называется - КомпоновщикНастроек). Дальше, если нам, к примеру, нужен отбор, то из реквизита "КомпоновщикНастроек" из раздела "Настройки" на форму вытаскивается таблица "Отбор", ну и так далее.

Затем в форму добавляется процедура "ПриСозданииНаСервере" с таким кодом:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   
МакетОтчетСКД = ПолучитьОбщийМакет("ОтчетСКД");
   
АдресМакетаОтчетаСКД = ПоместитьВоВременноеХранилище(МакетОтчетСКД, УникальныйИдентификатор);

   
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресМакетаОтчетаСКД));
   
КомпоновщикНастроек.ЗагрузитьНастройки(МакетОтчетСКД.НастройкиПоУмолчанию);

КонецПроцедуры

(где "АдресМакетаОтчетаСКД" - некая общая строковая переменная, которая может передаваться между вызовами сервера, например, тоже реквизит формы)

А дальше при нажатии на кнопку "Сформировать" вызывается серверная процедура примерно с таким кодом:

МакетОтчетСКД = ПолучитьИзВременногоХранилища(АдресМакетаОтчетаСКД);

Настройки=КомпоновщикНастроек.Настройки;

//---Расскомментировать, если нужно установить параметры отчета
//ПараметрОтчета1 = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Параметр1"));
//Если ПараметрОтчета1 <> Неопределено Тогда
//  ПараметрОтчета1.Значение = ЗначениеПараметра;
//  ПараметрОтчета1.Использование = Истина;
//КонецЕсли;

КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки=Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(МакетОтчетаСКД,Настройки,ДанныеРасшифровки);

ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,ДанныеРасшифровки);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);

Причем, обратите внимание на метод "Инициализировать" у компоновщика настроек. Синтакс-помощник пишет, что методу необходимо передавать "ИсточникДоступныхНастроекКомпоновкиДанных", а конструктор объекта этого типа бывает двух видов:
  • На основании URL - Создает источник, получающий схему компоновки данных, по переданному URL.
  • На основании схемы - Инициализирует источник доступных настроек на основе схемы компоновки данных.
Так, вот несмотря на то, что создание источника доступных настроек может быть осуществлено на основании схемы компоновки, правильным будет помещать схему во временное хранилище и создавать на основании URL (как в примере). Иначе, таблица с отборами на форме не будет работать.

P.S.: Этот пост написан в качестве памятки, и не содержит ничего нового или интересного.
P.P.S.: По материалам треда "Не могу отобразить настройки на форме из реквизита типа КомпоновщикНастроек" с форума 1С.

4 комментария:

svmix комментирует...

Вы просто гений! Это лучший пост в сети про программный вывод СКД!

закралась орфо-ошибка МакетОтчетСКД и МакетОтчетаСКД
Все заработало.

Green FiLin комментирует...

Спасибо, конечно. =)
Но, это, как я уже писал просто закладка для себя.
По поводу СКД лучший сборник рецептов, на мой взгляд, тут: http://1cskd.ru/
(кстати, почему-то сайт лежит :(

Sergey Yarusov комментирует...

Спасибо, помогло.
Но непонятно, почему не отрабатывает (ПриСозданииНаСервере) такая конструкция:

СхемаКомпоновкиДанных = Отчеты.Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

Поля отбора появляются на форме, но с красным крестиком

Green FiLin комментирует...

Возможно дело в самой схеме.

Если эти поля в наборах данных?

Отправить комментарий