Как программно сформировать отчет на основе СКД без объекта метаданных «Отчет»?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основные этапы программного формирования

Для реализации этой задачи необходимо отойти от стандартного вызова формы отчета и перейти к работе с объектами встроенного языка, отвечающими за компоновку. Мы пройдем через следующие этапы:

  1. Получение схемы компоновки данных из произвольного источника.
  2. Инициализация компоновщика настроек.
  3. Создание макета компоновки с помощью объекта КомпоновщикМакетаКомпоновкиДанных.
  4. Процесс выполнения компоновки и вывод результата в табличный документ.

Шаг 1: Получение схемы компоновки данных

Первое, что нам нужно сделать — это получить объект СхемаКомпоновкиДанных. В зависимости от того, где вы храните схему, методы получения будут различаться. Если схема является макетом текущего объекта (например, справочника или обработки), воспользуемся методом ПолучитьМакет:


// Пример получения схемы из макета объекта
СхемаСКД = ПолучитьМакет("МакетСхемыКомпоновки");

Если же схема хранится в файле или в виде строки XML, мы можем прочитать её следующим образом:


// Чтение схемы из XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("ПутьКФайлу.xml");
СхемаСКД = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

Шаг 2: Настройка компоновки

После получения схемы необходимо инициализировать КомпоновщикНастроекКомпоновкиДанных. Он позволит нам управлять параметрами, отборами и группировками. В случае динамических сегментов (как в 1С:УТ 11 или ERP) настройки часто сохраняются в ХранилищеЗначения. При необходимости мы можем загрузить сохраненные настройки в компоновщик:


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

Шаг 3: Выполнение компоновки данных

Это центральный момент, упомянутый в нашей дискуссии. Чтобы подготовить данные к выводу, мы используем объект КомпоновщикМакетаКомпоновкиДанных. Метод Выполнить() принимает на вход саму схему и объект с настройками, формируя на выходе МакетКомпоновкиДанных.


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроек.ПолучитьНастройки());

Шаг 4: Процессоры компоновки и вывод результата

Теперь у нас есть готовый МакетКомпоновкиДанных. Осталось пропустить его через ПроцессорКомпоновкиДанных и вывести в ТабличныйДокумент.


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Практические советы и нюансы

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

Важно помнить:

Таким образом, мы выяснили, что для открытия СКД программно достаточно «скормить» схему процессору компоновки. Этот метод является мощным инструментом для динамической фильтрации и формирования отчетов «на лету» без привязки к жесткой структуре метаданных конфигурации.

← На главную