Профессия — 1С » Внешние данные в СКД

Профессия — 1С

Рукопашный бой Карташ

Категории

-->

Внешние данные в СКД

рубрики: СКД | Дата: 22 ноября, 2016

Достаточно часто при использовании системы компоновки данных
возникает ситуация, когда есть данные не относящиеся к метаданным и к которым
соответственно нельзя обратиться из запроса СКД. Ярким примером
может служить таблица значений.
Но тем не менее существует способ, который позволяет
поместить эти данные в систему компоновки данных, чтобы потом вывести их в отчет
с использованием всей мощи СКД в части установки отборов, оформления полей, вывода
итогов в группировках и т.д. Речь идет о внешних наборах данных.
И здесь нам пригодиться навык программного формирования отчета на СКД

В качестве примера создадим отчет, который будет выводить информацию о ролях
пользователей. Непосредственно в запросе мы не можем получить эти данные.
Поэтому придется предварительно сформировать таблицу значений.

В первую очередь создадим внешний отчет и откроем в нем основную схему компоновки
данных. А в ней добавим набор данных с типом объект.

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

Переходим на закладку Настройки и делаем настройки как показано на рисунке.
Здесь все стандартно, ничего нового нет.

Со схемой компоновки закончили. Теперь создаем форму отчета, добавляем команду
СформироватьОтчет с соответствующей кнопкой в командной панели формы,
а в модуле формы прописываем следующий код:



&НаСервере
Функция ПолучитьТаблицуРолейПользователей()

    ТаблицаПользователейРолей = Новый ТаблицаЗначений;
    ТаблицаПользователейРолей.Колонки.Добавить("Пользователь",	Новый ОписаниеТипов("Строка"));
    ТаблицаПользователейРолей.Колонки.Добавить("Роль",			Новый ОписаниеТипов("Строка"));

    МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();

    Для каждого Пользователь Из МассивПользователей Цикл

	ИмяПользователя = Пользователь.Имя;

	Для каждого РольПользователя Из Пользователь.Роли Цикл

	    НоваяСтрока = ТаблицаПользователейРолей.Добавить();

	    НоваяСтрока.Пользователь	= ИмяПользователя;
	    НоваяСтрока.Роль			= РольПользователя.Имя;

	КонецЦикла;

    КонецЦикла;

    Возврат ТаблицаПользователейРолей;

КонецФункции // ПолучитьТаблицуРолейПользователей()

&НаСервере
Процедура СформироватьОтчетНаСервере()

    Результат.Очистить();

    //Получаем схему компоновки данных
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    СхемаКД     = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

    //Получаем настройки компоновки данных
    НастройкиКД = Отчет.КомпоновщикНастроек.Настройки;

    //Получаем макет компоновки данных
    КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКД             = КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД);

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

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

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

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

&НаКлиенте
Процедура СформироватьОтчет(Команда)
	
    СформироватьОтчетНаСервере();
	
КонецПроцедуры

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



ТаблицаПользователейРолей       = ПолучитьТаблицуРолейПользователей();
СтруктураВнешнихДанных          = Новый Структура;
СтруктураВнешнихДанных.Вставить("ПользователиРоли", ТаблицаПользователейРолей);

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

После формирования отчета мы видим, что данные из нашей таблицы значений
сгруппированы в соответствии с настройками схемы компоновки данных.

Здесь мы рассмотрели простейший случай. Но на самом деле в схему компоновки данных
может быть передано несколько внешних наборов данных. А также они могут соединяться
с наборами данных других типов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

   

2014 - 2023г. Профессия — 1С. Обмен опытом по программированию в 1С