рубрики: СКД | Дата: 22 ноября, 2016
Достаточно часто при использовании системы компоновки данных
возникает ситуация, когда есть данные не относящиеся к метаданным и к которым
соответственно нельзя обратиться из запроса СКД. Ярким примером
может служить таблица значений.
Но тем не менее существует способ, который позволяет
поместить эти данные в систему компоновки данных, чтобы потом вывести их в отчет
с использованием всей мощи СКД в части установки отборов, оформления полей, вывода
итогов в группировках и т.д. Речь идет о внешних наборах данных.
И здесь нам пригодиться навык программного формирования отчета на СКД
В качестве примера создадим отчет, который будет выводить информацию о ролях
пользователей. Непосредственно в запросе мы не можем получить эти данные.
Поэтому придется предварительно сформировать таблицу значений.
В первую очередь создадим внешний отчет и откроем в нем основную схему компоновки
данных. А в ней добавим набор данных с типом объект.
При этом мы видим, что у нас пропадает раздел, где мы могли формировать запрос,
а вместо него появляется поле (обведено красной рамкой на рисунке ниже)
«Имя объекта, содержащего данные». Имя можно ввести любое. Потом это
имя надо будет привязать к таблице значений, которую будем передавать в СКД в
качестве внешних данных.
Также в табличной части Поля: необходимо вручную добавить поля с указанием
их типа. Имена полей должны соответствовать именам колонок таблицы значений.
Переходим на закладку Настройки и делаем настройки как показано на рисунке.
Здесь все стандартно, ничего нового нет.
Со схемой компоновки закончили. Теперь создаем форму отчета, добавляем команду
СформироватьОтчет с соответствующей кнопкой в командной панели формы,
а в модуле формы прописываем следующий код:
&НаСервере
Функция ПолучитьТаблицуРолейПользователей()
ТаблицаПользователейРолей = Новый ТаблицаЗначений;
ТаблицаПользователейРолей.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("Строка"));
ТаблицаПользователейРолей.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка"));
МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для каждого Пользователь Из МассивПользователей Цикл
ИмяПользователя = Пользователь.Имя;
Для каждого РольПользователя Из Пользователь.Роли Цикл
НоваяСтрока = ТаблицаПользователейРолей.Добавить();
НоваяСтрока.Пользователь = ИмяПользователя;
НоваяСтрока.Роль = РольПользователя.Имя;
КонецЦикла;
КонецЦикла;
Возврат ТаблицаПользователейРолей;
КонецФункции // ПолучитьТаблицуРолейПользователей()
&НаСервере
Процедура СформироватьОтчетНаСервере()
Результат.Очистить();
//Получаем схему компоновки данных
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
СхемаКД = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//Получаем настройки компоновки данных
НастройкиКД = Отчет.КомпоновщикНастроек.Настройки;
//Получаем макет компоновки данных
КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКД = КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД);
//Сформируем таблицу значений
//и поместим в структуру для передачи в СКД в качестве внешних данных
ТаблицаПользователейРолей = ПолучитьТаблицуРолейПользователей();
СтруктураВнешнихДанных = Новый Структура;
СтруктураВнешнихДанных.Вставить("ПользователиРоли", ТаблицаПользователейРолей);
//Выводим результат компоновки данных в табличный документ
ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКД, СтруктураВнешнихДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКД);
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчет(Команда)
СформироватьОтчетНаСервере();
КонецПроцедуры
в функции ПолучитьТаблицуРолейПользователей() мы формируем таблицу значений,
которую затем передаем в качестве внешнего набора данных в СКД.
А сама передача осуществляется при инициализации процессора компоновки данных.
Предварительно необходимо поместить все необходимые внешние данные в структуру.
При этом ключ структуры должен совпадать с полем «Имя объекта, содержащего данные»,
о чем говорилось выше при создании схемы компоновки данных. Вот строки кода в
котрых все это происходит:
ТаблицаПользователейРолей = ПолучитьТаблицуРолейПользователей();
СтруктураВнешнихДанных = Новый Структура;
СтруктураВнешнихДанных.Вставить("ПользователиРоли", ТаблицаПользователейРолей);
ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКД, СтруктураВнешнихДанных);
После формирования отчета мы видим, что данные из нашей таблицы значений
сгруппированы в соответствии с настройками схемы компоновки данных.
Здесь мы рассмотрели простейший случай. Но на самом деле в схему компоновки данных
может быть передано несколько внешних наборов данных. А также они могут соединяться
с наборами данных других типов.
Добавить комментарий