В практике разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость сформировать отчет без участия пользователя. Это может потребоваться для работы регламентных заданий, рассылки отчетов по электронной почте или автоматической выгрузки данных во внешние системы в форматах PDF, Excel или HTML. В данной статье мы разберем детальный алгоритм программной работы с Системой компоновки данных (СКД).
Процесс программного вывода отчета существенно отличается от интерактивного нажатия кнопки "Сформировать". Нам необходимо последовательно задействовать цепочку объектов платформы, которые в обычном режиме скрыты за интерфейсом. Проанализируем эти этапы:
СхемаКомпоновкиДанных).НастройкиКомпоновкиДанных).КомпоновщикМакетаДанных).ПроцессорКомпоновкиДанных).ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент).Рассмотрим подробнее каждый из этих шагов на конкретном примере кода.
Прежде всего, нам нужно получить саму схему. Обычно она хранится в макете отчета. Если мы работаем внутри модуля отчета, мы можем получить её методом ПолучитьМакет. Если извне — через метаданные.
// Получаем схему из макета отчета
Схема = Отчеты.НазваниеВашегоОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем настройки по умолчанию или из конкретного варианта
Настройки = Схема.НастройкиПоУмолчанию;
// Если нужно использовать конкретный вариант отчета:
// Настройки = Схема.ВариантыНастроек.Найти("ИмяВарианта").Настройки;
Важно понимать, что НастройкиКомпоновкиДанных — это структура, описывающая, какие поля выбраны, какие установлены отборы и параметры.
Разберем ситуацию, когда в отчете необходимо программно задать период или другие параметры данных. Это одна из самых частых задач. Мы должны обратиться к коллекции ПараметрыДанных внутри настроек.
// Установка значения параметра "Период"
ЗначениеПараметра = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
Выясним причину, почему параметры могут не применяться: всегда проверяйте свойство Использование. Если оно установлено в Ложь, платформа проигнорирует переданное значение.
На этом этапе мы превращаем абстрактную схему и настройки в конкретный макет, который учитывает особенности версии платформы и доступные данные. Для этого используется КомпоновщикМакетаДанных.
КомпоновщикМакета = Новый КомпоновщикМакетаДанных;
// Формируем макет для вывода в табличный документ
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляРезультатаТабличныйДокумент"));
Здесь Тип("ГенераторМакетаКомпоновкиДанныхДляРезультатаТабличныйДокумент") указывает системе, что итогом будет привычная печатная форма (таблица).
Теперь необходимо выполнить запросы к базе данных. Процессор компоновки данных (ПроцессорКомпоновкиДанных) связывает макет с реальными данными из таблиц 1С.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
Обратите внимание: если ваш отчет использует внешние наборы данных (например, таблицу значений, переданную в СКД), их нужно передать вторым параметром в метод Инициализировать в виде структуры.
На заключительном этапе мы используем ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, чтобы "нарисовать" отчет в объекте ТабличныйДокумент, который затем легко сохранить на диск.
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Сохранение в PDF
ПутьКФайлу = "C:\Reports\MonthlyReport.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Посмотрим на доступные форматы сохранения. Метод Записать поддерживает множество типов: XLSX, PDF, HTML, DOCX и даже MXL (внутренний формат 1С). Это позволяет гибко интегрировать отчеты в любые бизнес-процессы.
Если мы планируем выполнять этот код в регламентном задании (на сервере), важно помнить следующие моменты:
ПолучитьИмяВременногоФайла().НачатьВывод, ВывестиЭлемент и ЗакончитьВывод).Проанализируем ситуацию с большими объемами данных. Вместо метода Вывести(), который загружает весь результат в память, можно использовать итерационный подход:
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Такой подход позволяет контролировать процесс вывода и, при необходимости, прерывать его или добавлять кастомную обработку между строками отчета.
Мы детально разобрали, как программно управлять механизмом СКД. Использование объектов СхемаКомпоновкиДанных, КомпоновщикМакетаДанных и ПроцессорКомпоновкиДанных дает разработчику полный контроль над формированием отчетности, позволяя автоматизировать даже самые сложные аналитические задачи без участия пользователя. Помните о правильной установке параметров и проверке прав доступа при работе на стороне сервера.