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