Перейти к содержимому

Система компоновки данных

1С СКД: Суммирование значений на различных уровнях группировок

1С СКД: Суммирование значений на различных уровнях группировок

В данной небольшой заметке хочу показать, как можно произвести суммирование значений на различных уровнях группировки, в отчете с использованием системы компоновки данными.
Как показано на изображении, только на уровне группировки «Группы номенклатуры», рассчитывается ресурс «Заказать», в нем отображается, сколько нужно заказать по текущей группе номенклатуры исходя из определенных условий:

1С СКД: Суммирование значений на различных уровнях группировок
1С СКД: Суммирование значений на различных уровнях группировок

Данное значение может быть рассчитано только на данном уровне группировки, так как, выше или ниже, отсутствуют значения для расчета. Например, на уровне детальных записей, нет данных по максимальному количеству в группе, потому что эти данные верны только для группы в целом, а не для отдельных ее составляющих.

Соответственно, теперь необходимо рассчитать итоги, по выше находящимся группировкам («Склады», «ТипыСкладов») и общий итог.

Для этого используется функция ВычислитьВыражениеСГруппировкойМассив:

ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ (EVALEXPRESSIONWITHGROUPARRAY)
Синтаксис:
ВычислитьВыражениеСГруппировкойМассив(<Выражение>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>)
Описание:
Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Компоновщик макета при генерации макета преобразовывает параметры функции в термины полей макета компоновки данных. Например, поле Контрагент будет преобразовано в НаборДанных.Контрагент.
Компоновщик макета при генерации выражений для вывода пользовательского поля, в выражении которого присутствует только функцияВычислитьМассивСГруппировкойМассив(), генерирует выводимое выражение таким образом, чтобы выводимая информация была упорядочена. Например, для пользовательского поля с выражением:

ВычислитьВыражениеСГруппировкойМассив(«Сумма(СуммаОборот)», «Контрагент»)
Компоновщик макета сгенерирует для вывода следующее выражение:

СоединитьСтроки(Массив(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений(«Представление(Сумма(НаборДанных.СуммаОборот)),Сумма(НаборДанных.СуммаОборот)»,»НаборДанных.Контрагент»),»2″)))

Параметры:
<Выражение>
Тип: Строка. Выражение, которое нужно вычислить. Строка, например, Сумма(СуммаОборот).
<ВыражениеПолейГруппировки>
Тип: Строка. Выражения полей группировки – выражения полей группировки, перечисленные через запятую. Например, Контрагент, Партия.
<ОтборЗаписей>
Тип: Строка. Выражение, описывающее отбор, применяемый к детальным записям. В выражении не поддерживается использование агрегатных функций. Например,ПометкаУдаления = Ложь.
<ОтборГруппировок>
Тип: Строка. Выражение, описывающее отбор, применяемый к групповым записям. Например, Сумма(СуммаОборот) > &Параметр1.
Пример:

Максимум(ВычислитьВыражениеСГруппировкойМассив («Сумма(СуммаОборот)», «Контрагент»));

Подробное описание синтаксиса функции можно найти по адресу http://its.1c.ru/db/v837doc#bookmark:dev:TI000000582
Теперь для расчета, продублируем поле «Заказать», с различными значениями «Рассчитывать по…», используя следующие выражения, обратите внимание, что в каждом выше стоящем уровне используются значения уровней ниже стоящих группировок.

В итоге получаем следующую конструкцию:

1С СКД: Суммирование значений на различных уровнях группировок
1С СКД: Суммирование значений на различных уровнях группировок

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

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

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

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

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

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

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

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

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

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

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

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

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

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