В данном материале приведены примеры и кейсы программного формирования отчетов с использованием системы компоновки данных. Статья в большей степени практическая, с конкретными рецептами кода для той или иной задачи.
Пример программного формирования отчета на СКД
&НаСервере Процедура СформироватьНаСервере(ТабДок) ОбъектОтчетНаСервере = РеквизитФормыВЗначение("Отчет"); // Здесь стоит обратить внимание, что мы можем работать с любым макетом, // не обязательно с основной схемой компоновки данных СхемаСКД = ОбъектОтчетНаСервере.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); КомпоновщикНастроекДанныхОтчета = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроекДанныхОтчета.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД)); КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию); // В том случае, если нам нужно учитывать настройки, выполненные пользователем, их необходимо загрузить КомпоновщикНастроекДанныхОтчета.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроекДанныхОтчета.ПолучитьНастройки()); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет); // Выведем полученные данные в табличный документ ТабДок.Очистить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры &НаКлиенте Процедура СформироватьОтчетПрограммно(Команда) // Для того, чтобы сделать код универсальнее, явным образом передадим табличный документ, куда будет выведен отчет. СформироватьНаСервере(Результат); Элементы.Результат.ОтображениеСостояния.Видимость = Ложь; Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать; КонецПроцедуры
Программная установка параметров и отборов в СКД
Для того чтобы программно установить параметр или отбор в отчете СКД, дополним рассмотренный выше пример.
Важно! Чтобы без дополнительного кода применять программно заданные настройки, соответствующие элементы (конкретные параметры, или строки отбора) необходимо исключить из пользовательских настроек! В противном случае, приоритет будут иметь пользовательские настройки.
// Использование текущих настроек компоновщика вместо настроек по умолчанию из схемы КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(ОбъектОтчетНаСервере.КомпоновщикНастроек.Настройки); // Параметры в СКД можно найти по имени параметра. ПараметрыДанных = КомпоновщикНастроекДанныхОтчета.Настройки.ПараметрыДанных.Элементы; ЭлементНачалоПериода = ПараметрыДанных.Найти("НачалоПериода"); ЭлементНачалоПериода.Использование = Истина; ЭлементНачалоПериода.Значение = ДАТА(2017,01,01,00,00,00); // В отличие от параметров, отбор необходимо обходить циклом и проверять каждую строку. // Кроме того, сравниваем не строки, а поля компоновки, используя ПолеКомпоновкиДанных ОтборКомпоновщика = КомпоновщикНастроекДанныхОтчета.Настройки.Отбор; Для Каждого ЭлементОтбора Из ОтборКомпоновщика.Элементы Цикл Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар") Тогда ОтборКомпоновщика.Элементы.Удалить(ЭлементОтбора); КонецЕсли; КонецЦикла; НоменклатураОтбор = ОтборКомпоновщика.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НоменклатураОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; НоменклатураОтбор.Использование = Истина; НоменклатураОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар"); НоменклатураОтбор.ПравоеЗначение = Справочники.Товары.НайтиПоНаименованию("Авторучка");
Как программно изменить структуру отчета СКД
Иногда возникает задача в зависимости от разных условий изменять структуру отчета – включить одну группировку и выключить другую, заменить детальные записи на группировку по каким-нибудь полям, добавить новую группировку, изменить отбор на уровне группировки и т.п.
Для решения данного класса задач используется объект Структура. Следует иметь в виду, что структура имеет древовидный характер, и в общем виде обходить ее нужно рекурсивно.
// Добавим программно группировку по складу Структура = КомпоновщикНастроекДанныхОтчета.Настройки.Структура; ГруппировкаПоСкладу = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ГруппировкаПоСкладу.Имя = "Склад"; ГруппировкаПоСкладу.Использование = Истина; //группировка по полю "Склад". Если нужны детальные записи, то просто не заполняем ПоляГруппировки ПолеГруппировкиСклад = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировкиСклад.Использование = Истина; ПолеГруппировкиСклад.Поле = Новый ПолеКомпоновкиДанных("Склад"); ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы; //добавить выводимые поля в группировке: склад и количество приход. ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад"); ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоПриход");
В случае, если нам понадобится добавить подчиненную (вложенную) группировку, нужно будет работать с коллекцией ГруппировкаПоСкладу.Структура. Принцип останется тот же – добавить при необходимости поля группировки, добавить выводимые поля. Также, на уровне конкретной группировки в структуре можно программно настроить отбор, сортировку, условное оформление и др.
Использование обработчика ПриКомпоновкеРезультата
У отчетов в 1С есть обработчик события ПриКомпоновкеРезультата. В контексте этого обработчика доступны объекты КомпоновщикНастроек и СхемаКомпоновкиДанных, если у отчета задана Основная схема компоновки данных.
Важный нюанс: данный обработчик не будет выполнен, если отчет формируется программно, как рассмотрено в примерах выше.
Начнем с простого формирования отчета, без учета пользовательских настроек:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; Результат = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); ДокументРезультат.Вывести(Результат); КонецПроцедуры
Это по сути заготовка, шаблон для всех дальнейших манипуляций с отчетом. Подходы к работе с СКД в этом обработчике практически ничем не отличаются от рассмотренных выше.
Следующий распространенный вариант использования программного формирования отчета – вывод данных в таблицу значений или дерево значений. Ключевое отличие – другой тип генератора, и использование метода УстановитьОбъект вместо метода УстановитьДокумент.
//Вывод результата в Таблицу значений или Дерево значений Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; Результат = Новый ТаблицаЗначений; ПроцессорВывода.УстановитьОбъект(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры
Пингбэк: Как в отчете на СКД сделать нумерацию колонок? - Alexcode