Как программно сформировать отчет на базе СКД и сохранить его в файл?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость сформировать отчет без участия пользователя. Это может потребоваться для работы регламентных заданий, рассылки отчетов по электронной почте или автоматической выгрузки данных во внешние системы в форматах PDF, Excel или HTML. В данной статье мы разберем детальный алгоритм программной работы с Системой компоновки данных (СКД).

Основные этапы программного формирования отчета

Процесс программного вывода отчета существенно отличается от интерактивного нажатия кнопки "Сформировать". Нам необходимо последовательно задействовать цепочку объектов платформы, которые в обычном режиме скрыты за интерфейсом. Проанализируем эти этапы:

  1. Получение схемы компоновки данных (объект СхемаКомпоновкиДанных).
  2. Инициализация и заполнение настроек отчета (НастройкиКомпоновкиДанных).
  3. Создание и подготовка макета компоновки (КомпоновщикМакетаДанных).
  4. Выполнение самой компоновки (ПроцессорКомпоновкиДанных).
  5. Вывод результата в итоговый документ (ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент).

Рассмотрим подробнее каждый из этих шагов на конкретном примере кода.

Шаг 1: Инициализация схемы и настроек

Прежде всего, нам нужно получить саму схему. Обычно она хранится в макете отчета. Если мы работаем внутри модуля отчета, мы можем получить её методом ПолучитьМакет. Если извне — через метаданные.


// Получаем схему из макета отчета
Схема = Отчеты.НазваниеВашегоОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

// Получаем настройки по умолчанию или из конкретного варианта
Настройки = Схема.НастройкиПоУмолчанию;
// Если нужно использовать конкретный вариант отчета:
// Настройки = Схема.ВариантыНастроек.Найти("ИмяВарианта").Настройки;

Важно понимать, что НастройкиКомпоновкиДанных — это структура, описывающая, какие поля выбраны, какие установлены отборы и параметры.

Шаг 2: Программная установка параметров

Разберем ситуацию, когда в отчете необходимо программно задать период или другие параметры данных. Это одна из самых частых задач. Мы должны обратиться к коллекции ПараметрыДанных внутри настроек.


// Установка значения параметра "Период"
ЗначениеПараметра = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ЗначениеПараметра <> Неопределено Тогда
    ЗначениеПараметра.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
    ЗначениеПараметра.Использование = Истина;
КонецЕсли;

Выясним причину, почему параметры могут не применяться: всегда проверяйте свойство Использование. Если оно установлено в Ложь, платформа проигнорирует переданное значение.

Шаг 3: Компоновка макета

На этом этапе мы превращаем абстрактную схему и настройки в конкретный макет, который учитывает особенности версии платформы и доступные данные. Для этого используется КомпоновщикМакетаДанных.


КомпоновщикМакета = Новый КомпоновщикМакетаДанных;

// Формируем макет для вывода в табличный документ
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляРезультатаТабличныйДокумент"));

Здесь Тип("ГенераторМакетаКомпоновкиДанныхДляРезультатаТабличныйДокумент") указывает системе, что итогом будет привычная печатная форма (таблица).

Шаг 4: Выполнение запросов и получение результата

Теперь необходимо выполнить запросы к базе данных. Процессор компоновки данных (ПроцессорКомпоновкиДанных) связывает макет с реальными данными из таблиц 1С.


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Обратите внимание: если ваш отчет использует внешние наборы данных (например, таблицу значений, переданную в СКД), их нужно передать вторым параметром в метод Инициализировать в виде структуры.

Шаг 5: Вывод в Табличный документ и сохранение в файл

На заключительном этапе мы используем ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, чтобы "нарисовать" отчет в объекте ТабличныйДокумент, который затем легко сохранить на диск.


ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Сохранение в PDF
ПутьКФайлу = "C:\Reports\MonthlyReport.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);

Посмотрим на доступные форматы сохранения. Метод Записать поддерживает множество типов: XLSX, PDF, HTML, DOCX и даже MXL (внутренний формат 1С). Это позволяет гибко интегрировать отчеты в любые бизнес-процессы.

Особенности работы в фоновых заданиях

Если мы планируем выполнять этот код в регламентном задании (на сервере), важно помнить следующие моменты:

  1. Пути к файлам: Сервер должен иметь права на запись в указанную директорию. Лучше использовать временные файлы через ПолучитьИмяВременногоФайла().
  2. Отсутствие диалогов: Программный код не должен вызывать никаких окон предупреждений или вопросов, иначе фоновое задание "зависнет".
  3. Очистка памяти: При работе с очень большими отчетами рекомендуется явно очищать объекты или выполнять формирование порциями (используя методы НачатьВывод, ВывестиЭлемент и ЗакончитьВывод).

Проанализируем ситуацию с большими объемами данных. Вместо метода Вывести(), который загружает весь результат в память, можно использовать итерационный подход:


ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();

Такой подход позволяет контролировать процесс вывода и, при необходимости, прерывать его или добавлять кастомную обработку между строками отчета.

Заключение

Мы детально разобрали, как программно управлять механизмом СКД. Использование объектов СхемаКомпоновкиДанных, КомпоновщикМакетаДанных и ПроцессорКомпоновкиДанных дает разработчику полный контроль над формированием отчетности, позволяя автоматизировать даже самые сложные аналитические задачи без участия пользователя. Помните о правильной установке параметров и проверке прав доступа при работе на стороне сервера.

← На главную