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

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

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

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

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

  1. Получение схемы компоновки данных: извлечение объекта метаданных из конфигурации или внешнего файла.
  2. Инициализация настроек: получение текущих настроек из компоновщика или использование настроек по умолчанию.
  3. Установка параметров и отборов: программное заполнение значений, которые влияют на результат запроса.
  4. Компоновка макета: создание макета компоновки, который связывает схему с конкретными настройками.
  5. Вывод результата: использование процессора компоновки и процессора вывода для отрисовки данных в ТабличныйДокумент.

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

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

Начнем с того, что определимся, откуда мы берем схему. Если код пишется внутри модуля объекта отчета, то схему можно получить методом ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"). Если же мы работаем во внешней обработке или другом объекте, обратимся к метаданным.

Разберем пример инициализации базовых объектов:


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

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

Важно помнить, что объект НастройкиКомпоновкиДанных содержит структуру пользовательских настроек, которые мы будем модифицировать. Если мы хотим использовать настройки, которые уже установил пользователь на форме, следует обращаться к Отчет.КомпоновщикНастроек.Настройки.

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

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

Посмотрим на пример установки периода:


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

Обратите внимание на свойство Использование. Если не установить его в значение Истина, параметр не будет применен в запросе, даже если значение заполнено. Это распространенная причина пустых отчетов при программном вызове.

Управление отборами (фильтрами)

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

Рассмотрим ситуацию, когда нам нужно добавить отбор по полю Склад:


// Удаляем существующие отборы по этому полю, если они были
ПолеСклад = Новый ПолеКомпоновкиДанных("Склад");
Индекс = 0;
Пока Индекс < Настройки.Отбор.Элементы.Количество() Цикл
    Элемент = Настройки.Отбор.Элементы[Индекс];
    Если Элемент.ЛевоеЗначение = ПолеСклад Тогда
        Настройки.Отбор.Элементы.Удалить(Элемент);
    Иначе
        Индекс = Индекс + 1;
    КонецЕсли;
КонецЦикла;

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

Использование объекта ПолеКомпоновкиДанных обязательно, так как СКД работает не со строковыми именами, а со специальными объектами-указателями на поля схемы.

Компоновка макета и вывод в табличный документ

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

Проанализируем финальный блок кода, который отвечает за генерацию отчета:


// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

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

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

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

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

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

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

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


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

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

Важный момент: колонки в ТаблицаЗначений должны по именам и типам данных строго соответствовать полям, описанным во внешнем наборе данных в СКД.

Обработка ошибок и оптимизация

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

Посмотрим, как правильно обернуть вывод в обработку ошибок:


Попытка
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
Исключение
    Сообщить("Ошибка при компоновке макета: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Заключение

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

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

← На главную