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