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

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

Работа с Системой компоновки данных (СКД) — это одна из самых частых и в то же время объемных задач для разработчика 1С. Часто возникают ситуации, когда стандартной кнопки "Сформировать" недостаточно: например, если нужно отправить отчет по расписанию на электронную почту, сформировать его в фоновом задании или предварительно обработать настройки без участия пользователя. В данной статье мы подробно разберем механизм программного формирования отчета, проанализируем необходимые объекты и изучим примеры кода для реализации этой задачи.

Основные объекты системы компоновки данных

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

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

Рассмотрим подробнее каждый этап взаимодействия этих объектов в единой цепочке выполнения кода.

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

Выясним причину, по которой мы начинаем именно со схемы. Схема — это ресурс, на основании которого строится все остальное. Обычно схема хранится в макете отчета. Разберем по шагам процесс получения схемы и инициализации настроек:


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

// Получаем настройки по умолчанию или текущие настройки пользователя
Настройки = СхемаСКД.НастройкиПоУмолчанию;
// Если нужно использовать настройки из компоновщика (например, на форме):
// Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();

Важно понимать, что на этом этапе мы можем программно изменить любой параметр. Давайте посмотрим на пример установки значения параметра "Период":


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

Шаг 2: Создание макета компоновки

Проанализируем следующий важный объект — КомпоновщикМакетаКомпоновкиДанных. Этот объект берет "чертеж" (схему) и "пожелания" (настройки), создавая финальный исполнимый макет. Именно на этом этапе учитываются особенности конкретной СУБД и оптимизируются запросы.


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

// Формируем макет компоновки
// ДанныеРасшифровки - объект, который позволит пользователю кликать по ячейкам отчета
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);

Важный момент: если вы формируете отчет в фоновом задании для отправки по почте, объект ДанныеРасшифровки использовать не обязательно, так как интерактивность в PDF или Excel файле не сохранится.

Шаг 3: Выполнение компоновки данных

Теперь перейдем к самому процессу получения данных. Нам нужно инициализировать ПроцессорКомпоновкиДанных. Мы передаем ему макет и, если используются внешние наборы данных (например, таблицы значений), передаем их в виде структуры.


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

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


ВнешниеНаборы = Новый Структура;
ВнешниеНаборы.Вставить("МояТаблица", ТаблицаСДанными);

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы, ДанныеРасшифровки);

Шаг 4: Вывод результата в табличный документ

Завершающий этап нашей совместной работы — визуализация данных. Мы создаем ТабличныйДокумент, куда ПроцессорВывода последовательно "отрисует" все строки и колонки, предусмотренные настройками.


// Создаем результирующий табличный документ
РезультатТабДок = Новый ТабличныйДокумент;

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

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

Этот метод Вывести() является пакетным — он сразу выводит весь отчет. Если отчет очень большой, рекомендуется использовать поэлементный вывод (в цикле), чтобы иметь возможность отслеживать прогресс или прерывать операцию.

Дополнительные возможности: Сохранение и оформление

После того как мы получили заполненный РезультатТабДок, мы можем выполнить с ним любые действия. Например, сохраним его в формате PDF, что часто требуется для рассылок:


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

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

  1. РезультатТабДок.АвтоМасштаб = Истина; — чтобы отчет вписался по ширине страницы.
  2. РезультатТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; — для широких отчетов.
  3. РезультатТабДок.ОтображатьСетку = Ложь; — для чистого визуального стиля.

Типичные ошибки и способы их исправления

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

Всегда проверяйте, какой именно объект настроек вы передаете в КомпоновщикМакета.Выполнить(). Если вы работаете внутри модуля отчета, используйте ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки(), чтобы собрать все пользовательские отборы, сортировки и условное оформление.

Таким образом, мы детально рассмотрели весь цикл жизни отчета на СКД при его программном создании. Следуя этой структуре, вы сможете гибко управлять выводом данных в любой конфигурации на платформе 1С:Предприятие 8.3.

← На главную