Пусть, мы имеем отчет, построенный на СКД с набором данных - запрос. У полей отчета настроены роли и некое оформление.
Поступила задача доработать отчет. При этом, получить данные для СКД через набор данных - запрос - либо очень сложно, либо невозможно.
Решено получить данные в таблицу значений, затем передать их в СКД через набор данных - объект.
Но, изменить тип данных набора интерактивно в конструкторе СКД возможности нет. А создавать новый набор данных с типом - объект, и заново настраивать поля - желания мало. Тем более, что полей может быть много.
Делаем следующее:
Сохраняем схему в файл
Открываем сохраненный файл xml текстовым редактором. Я использую Notepad++.
- Меняем значение атрибута "xsi:type" элемента "dataSet" с "DataSetQuery" на "DataSetObject"
- Удаляем элемент "query"
- Добавляем элемент "objectName"
Должно получиться так:
Сохраняем изменения, загружаем схему из файла:
Набор данных успешно изменен с сохранением колонок с ролями и оформлением:
Осталось только написать в модуле объекта процедуру, в которой таблица значений предается в СКД:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ТЗ = ПолучитьТаблицуДанных(); Настройки = КомпоновщикНастроек.Настройки; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки); ВнешниеНаборыДанных = Новый Структура; ВнешниеНаборыДанных.Вставить("ТЗ",ТЗ); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,ДанныеРасшифровки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры