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