Разворачивание таблицы свойств и значений по колонкам через СКД






СКД! Юниоры 1С начинают паниковать, когда слышат эту аббревиатуру. Хороший пример, упрощающий жизнь начинающему разработчику, представлен ниже.

Warning

Данная статья не претендует на оригинальность и не является конечным решением.

Подходы решения задач и примеры программного кода несут исключительно обучающий характер.

 

Описание — достаточно простой способ развернуть таблицу неких свойств и характеристик в таблицу СКД.

Входные данные:

Код заполнения демо данных:

&НаСервере
Функция ПолучитьТаблицуДемоДанных()

ТаблицаДанных = Новый ТаблицаЗначений;

// добавим основные колонки
ТаблицаДанных.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаДанных.Колонки.Добавить("Свойство", Новый ОписаниеТипов("Строка"));
ТаблицаДанных.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка, Число"));
ТаблицаДанных.Колонки.Добавить("РеквизитУпорядочивания", Новый ОписаниеТипов("Число"));

// добавим тестовые данные
// яблоко
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Цвет", "Зеленый"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Цена", 55));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Единица", "штука"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Яблоко", "Остаток", 12));

// клубника
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Цвет", "Красный"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Цена", 600));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Единица", "кг"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Клубника", "Остаток", 5));

// банан
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Цвет", "Желтый"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Цена", 45));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Единица", "кг"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Банан", "Остаток", 20));

// манго
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Цвет", "Желтый"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Цена", 120));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Единица", "штука"));
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Новый Структура("Товар, Свойство, Значение", "Манго", "Остаток", 15));

// для того чтобы упорядочить вывод колонок
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Если СтрокаДанных.Свойство = "Цвет" Тогда
СтрокаДанных.РеквизитУпорядочивания = 1;
ИначеЕсли СтрокаДанных.Свойство = "Единица" Тогда
СтрокаДанных.РеквизитУпорядочивания = 2;
ИначеЕсли СтрокаДанных.Свойство = "Цена" Тогда
СтрокаДанных.РеквизитУпорядочивания = 3;
ИначеЕсли СтрокаДанных.Свойство = "Остаток" Тогда
СтрокаДанных.РеквизитУпорядочивания = 4;
КонецЕсли;
КонецЦикла;

Возврат ТаблицаДанных;

КонецФункции

Код программного формирования схемы компановки данных:

&НаСервере
Процедура СформироватьОтчетНаСервере()
// очситить табличный документ перед выводом новых жанных
ДокументРезультат.Очистить();

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

//Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

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

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

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

 Форма программно-формируемого отчета:

А теперь самое интересное: как из таблицы свойств и значений, средствами СКД получить это:

Настройка макета компановки данных:

  1. Добавим набор (источник) данных — объект:
  2. Установим значение свойства, как ресурс, без агрегатной функции:
  3. На вкладке настройки добавим таблицу СКД:
  4. Установим "Другие настройки" глобально на отчет:
  5. В новой таблице, в строки, добавим новую группировку; группируем строки по колонке Товар и выводим ее:
  6. Добавим группировку в колонки новой таблицы и зададим ей имя "СтолбецЗначенийСвойтва":
  7. Выберем поля для вывода в колонки:
  8. Установим упорядочивание вывода колонок:
  9. На вкладке Макеты установим свое оформление для макета группировки "СтолбецЗначенийСвойтва":

    Это поможет избежать вывода ненужной информации в шапке отчета, пример:

    Товар Цвет Единица Цена Остаток
    Значение Значение Значение Значение

Причины использования данного подхода:

  • Количество свойств и значений не ограничено, так как исходная таблица может содержать сколько угодно свойств и их значений.
  • Эффективно использовать в отчетах, которые получают данные, разделенные правами в базе 1С.

На этом все, спасибо за внимание!

Leave a Comment

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