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

Публикация № 1058972

Программирование - Практика программирования

СКД Программно Отчет формировать Таблица Программирование Макет Компановка Данных НаборДанных ОсновнаяСхемаКомпоновкиДанных СхемаКомпоновкиДанных ТаблицаЗначений

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

Warning

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

17

См. также

Специальные предложения

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение