При разработке регламентных заданий и автоматических механизмов рассылки часто возникает задача программного формирования отчетов на базе системы компоновки данных (СКД). Например, требуется взять типовой или созданный пользователем вариант отчета с определенным набором колонок и отборов, сформировать табличный документ без открытия экранных форм и сохранить его на диск в формате Excel для последующей отправки по электронной почте.
Разберем по шагам, где именно хранятся настройки вариантов отчетов, как правильно загрузить их в компоновщик настроек и вывести результат в файл.
В зависимости от того, как был создан нужный вариант отчета, его настройки извлекаются из разных источников:
СхемаКомпоновкиДанных.ВариантыНастроек. К ним можно обращаться по имени варианта.ВариантыОтчетов. Настройки компоновки в этом случае лежат в реквизите ХранилищеЗначений.ХранилищеВариантовОтчетов.Рассмотрим классический способ формирования отчета через программную инициализацию цепочки объектов СКД. Этот метод дает полный контроль над каждым шагом генерации отчета.
Обратим внимание на частую ошибку: объектом-приемником для ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент всегда должен выступать ТабличныйДокумент, а не ТаблицаЗначений.
Посмотрим на пример загрузки пользовательского варианта из справочника и выгрузки в файл Excel:
// 1. Получаем основную схему компоновки данных отчета
СхемаКомпоновкиДанных = Отчеты.ПрайсЛист.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 2. Инициализируем компоновщик настроек
КомпоновщикНастроекКД = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
// 3. Загружаем базовые настройки схемы по умолчанию
КомпоновщикНастроекКД.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
// 4. Находим нужный сохраненный вариант отчета и загружаем его настройки
ПользовательскийВариант = Справочники.ВариантыОтчетов.НайтиПоНаименованию("ЗверюгоЦветыАркиРозница");
Если ЗначениеЗаполнено(ПользовательскийВариант) Тогда
НастройкиВарианта = ПользовательскийВариант.ХранилищеЗначений.Получить();
Если НастройкиВарианта <> Неопределено Тогда
КомпоновщикНастроекКД.ЗагрузитьНастройки(НастройкиВарианта);
КонецЕсли;
КонецЕсли;
// 5. Компонуем макет данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
КомпоновщикНастроекКД.ПолучитьНастройки(),
,
,
Тип("ГенераторМакетаКомпоновкиДанныхДляТабличногоДокумента")
);
// 6. Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// 7. Выводим результат в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// 8. Сохраняем сформированный табличный документ в файл
ПутьХранения = "D:\bazi_1c\";
ИмяФайла = "Прайс " + Формат(ТекущаяДата(), "ДФ=""дд ММ гггг""") + ".xls";
ТабличныйДокумент.Записать(ПутьХранения + ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
Если для отчета назначена основная схема компоновки данных, код можно существенно сократить с помощью метода СкомпоноватьРезультат() объекта отчета.
Проанализируем пример получения предопределенного варианта прямо из схемы:
ОтчетОбъект = Отчеты.ПрайсЛист.Создать();
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
// Инициализируем настройки схемы
ОтчетОбъект.КомпоновщикНастроек.Инициализировать(
Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)
);
// Ищем предопределенный вариант по имени в схеме
ИмяНужногоВарианта = "Основной";
ВариантНастройки = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(ИмяНужногоВарианта);
Если ВариантНастройки <> Неопределено Тогда
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ВариантНастройки.Настройки);
КонецЕсли;
// Формируем отчет сразу в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
// Сохраняем в файл
ТабличныйДокумент.Записать("D:\bazi_1c\Price.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Если требуется генерировать индивидуальные прайс-листы под каждого клиента (например, с отбором по определенной группе номенклатуры или конкретному виду цен), нет необходимости создавать отдельный вариант отчета в справочнике под каждого контрагента. Достаточно загрузить базовый вариант и изменить нужный параметр или элемент отбора напрямую в коде:
// Установка значения параметра данных СКД
КомпоновщикНастроекКД.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"ВидЦены",
Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая")
);
При запуске генерации отчетов в регламентных заданиях важно помнить о следующих нюансах:
УстановитьПривилегированныйРежим(Истина).