Warning
Данная статья не претендует на оригинальность и не является конечным решением. Подходы решения задач и примеры программного кода несут исключительно обучающий характер. |
Описание — достаточно простой способ развернуть таблицу неких свойств и характеристик в таблицу СКД.
Входные данные:
Код заполнения демо данных:
&НаСервере
Функция ПолучитьТаблицуДемоДанных()
ТаблицаДанных = Новый ТаблицаЗначений;
// добавим основные колонки
ТаблицаДанных.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаДанных.Колонки.Добавить("Свойство", Новый ОписаниеТипов("Строка"));
ТаблицаДанных.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка, Число"));
ТаблицаДанных.Колонки.Добавить("РеквизитУпорядочивания", Новый ОписаниеТипов("Число"));
// добавим тестовые данные
// яблоко
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Цвет", "Зеленый"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Цена", 55));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Единица", "штука"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Остаток", 12));
// клубника
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Цвет", "Красный"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Цена", 600));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Единица", "кг"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Остаток", 5));
// банан
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Цвет", "Желтый"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Цена", 45));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Единица", "кг"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Остаток", 20));
// манго
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Цвет", "Желтый"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Цена", 120));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Единица", "штука"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Остаток", 15));
// для того чтобы упорядочить вывод колонок
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Если СтрокаДанных.Свойство = "Цвет" Тогда
СтрокаДанных.РеквизитУпорядочивания = 1;
ИначеЕсли СтрокаДанных.Свойство = "Единица" Тогда
СтрокаДанных.РеквизитУпорядочивания = 2;
ИначеЕсли СтрокаДанных.Свойство = "Цена" Тогда
СтрокаДанных.РеквизитУпорядочивания = 3;
ИначеЕсли СтрокаДанных.Свойство = "Остаток" Тогда
СтрокаДанных.РеквизитУпорядочивания = 4;
КонецЕсли;
КонецЦикла;
Возврат ТаблицаДанных;
КонецФункции
Код программного формирования схемы компановки данных:
&НаСервере
Процедура СформироватьОтчетНаСервере()
// очситить табличный документ перед выводом новых жанных
ДокументРезультат.Очистить();
//Получаем схему из макета
СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура("ТаблицаДанных", ПолучитьТаблицуДемоДанных()), ДанныеРасшифровки);
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчет(Команда)
СформироватьОтчетНаСервере();
КонецПроцедуры
Форма программно-формируемого отчета:
А теперь самое интересное: как из таблицы свойств и значений, средствами СКД получить это:
Настройка макета компановки данных:
- Добавим набор (источник) данных — объект:
- Установим значение свойства, как ресурс, без агрегатной функции:
- На вкладке настройки добавим таблицу СКД:
- Установим "Другие настройки" глобально на отчет:
- В новой таблице, в строки, добавим новую группировку; группируем строки по колонке Товар и выводим ее:
- Добавим группировку в колонки новой таблицы и зададим ей имя "СтолбецЗначенийСвойтва":
- Выберем поля для вывода в колонки:
- Установим упорядочивание вывода колонок:
- На вкладке Макеты установим свое оформление для макета группировки "СтолбецЗначенийСвойтва":
Это поможет избежать вывода ненужной информации в шапке отчета, пример:Товар Цвет Единица Цена Остаток Значение Значение Значение Значение
Причины использования данного подхода:
- Количество свойств и значений не ограничено, так как исходная таблица может содержать сколько угодно свойств и их значений.
- Эффективно использовать в отчетах, которые получают данные, разделенные правами в базе 1С.
На этом все, спасибо за внимание!