Получить консультацию

Как в 1С сформировать отчет на СКД программно

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

Пример программного формирования отчета на СКД

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

&НаКлиенте
Процедура СформироватьОтчетПрограммно(Команда)
	// Для того, чтобы сделать код универсальнее, явным образом передадим табличный документ, куда будет выведен отчет.
	СформироватьНаСервере(Результат);	
	Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;	
	Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
КонецПроцедуры

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

Для того чтобы программно установить параметр или отбор в отчете СКД, дополним рассмотренный выше пример.
Важно! Чтобы без дополнительного кода применять программно заданные настройки, соответствующие элементы (конкретные параметры, или строки отбора) необходимо исключить из пользовательских настроек! В противном случае, приоритет будут иметь пользовательские настройки. 

// Использование текущих настроек компоновщика вместо настроек по умолчанию из схемы
КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(ОбъектОтчетНаСервере.КомпоновщикНастроек.Настройки);

// Параметры в СКД можно найти по имени параметра.
ПараметрыДанных = КомпоновщикНастроекДанныхОтчета.Настройки.ПараметрыДанных.Элементы;
ЭлементНачалоПериода = ПараметрыДанных.Найти("НачалоПериода");
ЭлементНачалоПериода.Использование = Истина;
ЭлементНачалоПериода.Значение = ДАТА(2017,01,01,00,00,00);
	
// В отличие от параметров, отбор необходимо обходить циклом и проверять каждую строку.
// Кроме того, сравниваем не строки, а поля компоновки, используя ПолеКомпоновкиДанных
ОтборКомпоновщика = КомпоновщикНастроекДанныхОтчета.Настройки.Отбор;
Для Каждого ЭлементОтбора Из ОтборКомпоновщика.Элементы Цикл
	Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар") Тогда
		ОтборКомпоновщика.Элементы.Удалить(ЭлементОтбора);
	КонецЕсли;
КонецЦикла;

НоменклатураОтбор = ОтборКомпоновщика.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НоменклатураОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НоменклатураОтбор.Использование = Истина;
НоменклатураОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар");
НоменклатураОтбор.ПравоеЗначение = Справочники.Товары.НайтиПоНаименованию("Авторучка");

Как программно изменить структуру отчета СКД

Иногда возникает задача в зависимости от разных условий изменять структуру отчета – включить одну группировку и выключить другую, заменить детальные записи на группировку по каким-нибудь полям, добавить новую группировку, изменить отбор на уровне группировки и т.п.
Для решения данного класса задач используется объект Структура. Следует иметь в виду, что структура имеет древовидный характер, и в общем виде обходить ее нужно рекурсивно.

	// Добавим программно группировку по складу
	Структура = КомпоновщикНастроекДанныхОтчета.Настройки.Структура;
	ГруппировкаПоСкладу = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаПоСкладу.Имя = "Склад";
	ГруппировкаПоСкладу.Использование = Истина;
	
	//группировка по полю "Склад". Если нужны детальные записи, то просто не заполняем ПоляГруппировки
	ПолеГруппировкиСклад = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));       
	ПолеГруппировкиСклад.Использование      = Истина;
	ПолеГруппировкиСклад.Поле               = Новый ПолеКомпоновкиДанных("Склад");
	ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
	
	//добавить выводимые поля в группировке: склад и количество приход.
	ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));     
	ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад");
	ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));     
	ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоПриход");

В случае, если нам понадобится добавить подчиненную (вложенную) группировку, нужно будет работать с коллекцией ГруппировкаПоСкладу.Структура. Принцип останется тот же – добавить при необходимости поля группировки, добавить выводимые поля. Также, на уровне конкретной группировки в структуре можно программно настроить отбор, сортировку, условное оформление и др.

Использование обработчика ПриКомпоновкеРезультата

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

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

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

Следующий распространенный вариант использования программного формирования отчета – вывод данных в таблицу значений или дерево значений. Ключевое отличие – другой тип генератора, и использование метода УстановитьОбъект вместо метода УстановитьДокумент.

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

Оставьте комментарий

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

тринадцать + один =

К НАЧАЛУ