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

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

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

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

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

  1. Получение схемы компоновки данных: Схема — это фундамент отчета, содержащая запросы, наборы данных и описание полей.
  2. Работа с настройками: На этом этапе мы определяем, какие параметры, отборы и группировки будут применены.
  3. Создание макета компоновки: Платформа объединяет схему и настройки в конкретный макет, готовый к исполнению.
  4. Инициализация процессора компоновки: Этот объект отвечает за выполнение запросов и агрегацию данных.
  5. Вывод результата: Финальный этап, где процессор вывода заполняет ТабличныйДокумент или другой приемник данных.

Шаг 1: Получение схемы и настроек компоновки

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

Разберем пример кода, который выполняет начальную подготовку:


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

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

// Если нужно использовать настройки конкретного компоновщика (например, из формы):
// Настройки = КомпоновщикНастроек.ПолучитьНастройки();

Важно помнить, что НастройкиПоУмолчанию возвращают именно те параметры, которые заданы в конфигураторе. Если вы хотите программно изменить параметры, например, установить дату начала периода, это нужно делать именно в объекте Настройки.

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

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


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

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

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

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

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


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

На этом этапе 1С подготавливает внутренние временные таблицы и выполняет расчеты. Если схема сложная, выполнение метода Инициализировать может занять время.

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

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


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

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

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

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

Программное изменение параметров и отборов

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


// Поиск параметра по имени
ИмяПараметра = "ПериодОтчета";
ЗначениеПараметра = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);

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

Аналогичным образом можно работать с отборами. Рассмотрим пример установки отбора по конкретной организации:


ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = СсылкаНаОрганизацию;
ЭлементОтбора.Использование = Истина;

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

Если вы планируете использовать этот код в регламентных заданиях, помните, что на сервере нет доступа к формам и некоторым клиентским методам. Весь код должен быть сосредоточен в серверных модулях. Также важно следить за тем, чтобы все типы данных, используемые в параметрах, были сериализуемыми. При работе с внешними данными обратите внимание на оптимизацию отчетов с набором данных - объект, чтобы избежать проблем с производительностью.

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


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

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

← На главную