Зачастую при разработке прикладных решений на платформе 1С:Предприятие возникает задача вывода данных с помощью Системы компоновки данных (СКД), при этом сам отчет не является объектом метаданных. Например, это может быть динамическое формирование состава сегментов, вывод произвольных данных из справочников или обработок, где макет СКД хранится в виде двоичных данных или XML. Разберем по шагам, как реализовать такую задачу.
Для реализации этой задачи необходимо отойти от стандартного вызова формы отчета и перейти к работе с объектами встроенного языка, отвечающими за компоновку. Мы пройдем через следующие этапы:
КомпоновщикМакетаКомпоновкиДанных.Первое, что нам нужно сделать — это получить объект СхемаКомпоновкиДанных. В зависимости от того, где вы храните схему, методы получения будут различаться. Если схема является макетом текущего объекта (например, справочника или обработки), воспользуемся методом ПолучитьМакет:
// Пример получения схемы из макета объекта
СхемаСКД = ПолучитьМакет("МакетСхемыКомпоновки");
Если же схема хранится в файле или в виде строки XML, мы можем прочитать её следующим образом:
// Чтение схемы из XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("ПутьКФайлу.xml");
СхемаСКД = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
После получения схемы необходимо инициализировать КомпоновщикНастроекКомпоновкиДанных. Он позволит нам управлять параметрами, отборами и группировками. В случае динамических сегментов (как в 1С:УТ 11 или ERP) настройки часто сохраняются в ХранилищеЗначения. При необходимости мы можем загрузить сохраненные настройки в компоновщик:
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД));
// Загрузка сохраненных настроек, если они есть
КомпоновщикНастроек.ЗагрузитьНастройки(СохраненныеНастройки);
Это центральный момент, упомянутый в нашей дискуссии. Чтобы подготовить данные к выводу, мы используем объект КомпоновщикМакетаКомпоновкиДанных. Метод Выполнить() принимает на вход саму схему и объект с настройками, формируя на выходе МакетКомпоновкиДанных.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроек.ПолучитьНастройки());
Теперь у нас есть готовый МакетКомпоновкиДанных. Осталось пропустить его через ПроцессорКомпоновкиДанных и вывести в ТабличныйДокумент.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Проанализируем ситуацию: зачем это нужно? Такой подход позволяет создавать гибкие инструменты фильтрации, не создавая сотни объектов метаданных. Например, в 1С:УТ 11 механизм сегментов номенклатуры работает именно так — настройки СКД хранятся в базе, и при каждом обращении к сегменту система программно выполняет запрос, фильтруя номенклатуру согласно этим настройкам.
Важно помнить:
ПроцессорКомпоновкиДанных в цикле, получая записи через ПолучитьСледующий(). Это гораздо быстрее и эффективнее, если результат нужно обработать кодом.КомпоновщикНастроекКомпоновкиДанных. Несмотря на то, что это не стандартный отчет, пользователь получит полноценное окно настройки параметров и отборов, как в обычном отчете.Таким образом, мы выяснили, что для открытия СКД программно достаточно «скормить» схему процессору компоновки. Этот метод является мощным инструментом для динамической фильтрации и формирования отчетов «на лету» без привязки к жесткой структуре метаданных конфигурации.