Программное добавление полей и ресурсов в СКД

Программное добавление полей и ресурсов в СКД

В данном примере будет показано, как осуществить программное добавление полей и ресурсов в СКД отчет, а так же, как передать таблицу значений в качества источника данных. Для примера реализации программного добавления полей в систему компоновки данных, будет использоваться таблица значений с неизвестным количеством колонок, которые нужно вывести в отчет СКД.
Для начала необходимо создать внешний отчет, в модуле объекта которого добавить процедуру ПриКомпоновкеРезультата:

1С программное добавление полей и ресурсов в СКД - СозданиеОтчета

1С программное добавление полей и ресурсов в СКД — СозданиеОтчета


В указанную процедуру добавим следующий код, в комментариях, описаны основные действия, сначала создается таблица значений со случайным количеством колонок, далее колонки, поля, ресурсы, программно добавляются в систему компоновки данными и передаются как внешний набор данных:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	//Структура внешних данных, для передачи в СКД
	ВнешниеНаборыДанных = Новый Структура; 
	
	тзДанные = Новый ТаблицаЗначений;
	
	тзДанные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
	тзДанные.Колонки.Добавить("УникальноеНаименование", Новый ОписаниеТипов("Строка"));
	
	//С помощью генератора случайных чисел определяем количество колонок
	ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел();
	
	СлучайноеЧисло = ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 10);
	
	//Формируем колонки
	Для Индекс = 1 По СлучайноеЧисло Цикл
		тзДанные.Колонки.Добавить("Колонка" + Индекс, Новый ОписаниеТипов("Число"));
	КонецЦикла; 
	
	//Заполняем таблицу значений данными
	Для Индекс = 1 По 10 Цикл
		
		СтрокаТз = тзДанные.Добавить();
		
		СтрокаТз.Наименование			= "Начальная группировка";
		СтрокаТз.УникальноеНаименование = Новый УникальныйИдентификатор;
		
		Для Счетчик = 1 По СлучайноеЧисло Цикл
			
			ИмяКолонки = "Колонка" + Счетчик;
			СтрокаТз[ИмяКолонки] = ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 10); 
			
		КонецЦикла; 
		
	КонецЦикла; 
	
	//Сохраняем таблицу значений в наборе внешних данных
	ВнешниеНаборыДанных.Вставить("тзДанные", тзДанные);
		
	//Получаем схему из макета
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//Из схемы возьмем настройки
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	//Программно добавляем поля и ресурсы
	Для Индекс = 1 По СлучайноеЧисло Цикл
		
		Поле = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
		
		Поле.Заголовок		= "Колонка" + Индекс;
		Поле.ПутьКДанным	= "Колонка" + Индекс;
		Поле.Поле			= "Колонка" + Индекс;
		Поле.ТипЗначения	= Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2)); 
		
		ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить(); 
		
		ПолеРесурса.Выражение	= "СУММА(Колонка" +  Индекс + ")"; 
		ПолеРесурса.ПутьКДанным	= "Колонка" + Индекс; 
	
		ПолеРесурса.Группировки.Добавить("Наименование"); 
		ПолеРесурса.Группировки.Добавить("УникальноеНаименование"); 
		ПолеРесурса.Группировки.Добавить("ОбщийИтог"); 
		
	КонецЦикла;
	
	//Добавляем в выбранные поля
	Для Индекс = 1 По СлучайноеЧисло Цикл
		
		ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		
		ВыбранноеПоле.Заголовок		= "Колонка" + Индекс;
		ВыбранноеПоле.Использование	= Истина; 
		ВыбранноеПоле.Поле			= Новый ПолеКомпоновкиДанных("Колонка" + Индекс); 
		
	КонецЦикла;
	
	//Помещаем в переменную данные о расшифровке данных
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Формируем макет, с помощью компоновщика макета
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	//Передаем в макет компоновки схему, настройки и данные расшифровки
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	//Выполним компоновку с помощью процессора компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	//Передаем внешний набор данных
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
	
	//Очищаем поле табличного документа
	ДокументРезультат.Очистить();
	
	//Выводим результат в табличный документ
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

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

После необходимо создать основную схему компоновки данных, как показано на изображении:

1С программное добавление полей и ресурсов в СКД - ВнешнийНаборДанных

1С программное добавление полей и ресурсов в СКД — ВнешнийНаборДанных


С простой настройкой группировки:
1С программное добавление полей и ресурсов в СКД - НастройкаГруппировки

1С программное добавление полей и ресурсов в СКД — НастройкаГруппировки


Сохранить внешний отчет и запустить в режиме 1С:Предприятие, несколько раз сформировать отчет, благодаря генератору случайных чисел, количество колонок практически всегда будет разным:
1С программное добавление полей и ресурсов в СКД - Итог

1С программное добавление полей и ресурсов в СКД — Итог


Тем самым было продемонстрировано, как программно добавить поле в систему компоновки данных.

Скачать рассмотренный в статье пример: ПрограммноеДобавлениеПолей

Программное добавление полей и ресурсов в СКД: 2 комментария

  1. Леонид

    Интересный отчетик! А как сделать, чтобы кнопка «Настройки» заработала, а не писала:

    «Не предусмотрено возможности настройки для этого варианта отчета»

    + Как сделать, чтобы при «Изменении варианта» были бы видны поля ТЗ и можно было бы по ним группировку делать (генератор при этом не нужен будет)

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

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