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

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

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

Общая схема программной работы с СКД

Для того чтобы программно получить готовый отчет (или использовать обёртку над объектной моделью СКД для сокращения кода), нам необходимо пройти через несколько ключевых этапов. Проанализируем каждый из них:

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

Шаг 1: Подготовка схемы и настроек

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


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

// 2. Получаем настройки (из компоновщика или стандартные)
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

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

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

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

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


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

// Генерация макета
// ДанныеРасшифровки используются, если нужен интерактивный отчет в форме
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

На этом этапе 1С проверяет корректность всех связей и доступность полей, указанных в настройках компоновки.

Шаг 3: Выполнение запросов и расчет данных

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


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

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

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

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


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

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

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

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

Особенности работы с внешними наборами данных

Рассмотрим подробнее ситуацию, когда источником данных в СКД выступает не запрос, а Объект (например, ТаблицаЗначений). В этом случае программный вызов немного меняется. Посмотрим на пример:


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

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

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

Заключение

Программное управление СКД предоставляет разработчику неограниченные возможности по автоматизации отчетности. Мы разобрали классическую цепочку объектов: СхемаКомпоновкиДанных -> Настройки -> КомпоновщикМакета -> ПроцессорКомпоновки -> ПроцессорВывода. Понимание этой последовательности позволяет легко диагностировать ошибки на каждом этапе и создавать сложные аналитические инструменты в рамках платформы 1С:Предприятие.

← На главную