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

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

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

Анализ проблемы: почему отчет не формируется?

Первая и самая распространенная ошибка — попытка установить значения параметров напрямую в объекте СхемаКомпоновкиДанных. Проанализируем типичный неработающий код:


// Неправильный подход!
СКД = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СКДНедооформлено");
// Попытка установить параметры напрямую в схеме
СКД.Параметры.ДатаНач.Значение = Период.ДатаНачала; 
СКД.Параметры.ДатаКон.Значение = Период.ДатаОкончания; 

// ... дальнейший код вывода

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

Шаг 1: Правильная установка параметров в настройках СКД

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

  1. Получаем схему компоновки данных из макета.
  2. Создаем КомпоновщикНастроекКомпоновкиДанных и инициализируем его нашей схемой.
  3. Получаем из компоновщика настроек объект НастройкиКомпоновкиДанных.
  4. В полученных настройках находим нужные нам параметры и устанавливаем их значения.

Обращаться к параметрам по индексу, как в примере ниже, не рекомендуется, так как их порядок в схеме может измениться.


// Ненадежный способ обращения к параметрам
Настройки.ПараметрыДанных.Элементы[0].Значение = Период.ДатаОкончания;
Настройки.ПараметрыДанных.Элементы[1].Значение = Период.ДатаНачала;

Гораздо надежнее искать параметр по его имени. Это гарантирует, что вы установите значение именно тому параметру, которому хотели, вне зависимости от его положения в списке.

Шаг 2: Ключевой момент — флаг "Использование"

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

Поэтому после установки значения параметра необходимо в обязательном порядке установить его флаг использования в Истина.

Посмотрим на пример кода, который находит параметры по имени и корректно устанавливает их значения и флаги использования:


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

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

// Если параметр существует, устанавливаем значение и флаг использования
Если ПараметрДатаНачала <> Неопределено Тогда
    ПараметрДатаНачала.Значение = Период.ДатаНачала;
    ПараметрДатаНачала.Использование = Истина;
КонецЕсли;

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

Если ПараметрДатаОкончания <> Неопределено Тогда
    ПараметрДатаОкончания.Значение = Период.ДатаОкончания;
    ПараметрДатаОкончания.Использование = Истина;
КонецЕсли;

Этот подход является наиболее правильным и надежным для работы с параметрами СКД.

Шаг 3: Полный алгоритм вывода отчета в табличный документ

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


&НаСервере
Процедура СформироватьОтчетНаСервере(ТДНедооформленныеЗаявки)
    
    // 1. Получаем схему компоновки данных из макета
    Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СКДНедооформлено");
    
    // 2. Инициализируем компоновщик настроек
    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    
    // 3. Получаем настройки и устанавливаем параметры
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Устанавливаем параметр ДатаНачала
    ЭлементПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаНачала"));
    Если ЭлементПараметра <> Неопределено Тогда
        ЭлементПараметра.Значение = Период.ДатаНачала;
        ЭлементПараметра.Использование = Истина;
    КонецЕсли;
    
    // Устанавливаем параметр ДатаОкончания
    ЭлементПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаОкончания"));
    Если ЭлементПараметра <> Неопределено Тогда
        ЭлементПараметра.Значение = Период.ДатаОкончания;
        ЭлементПараметра.Использование = Истина;
    КонецЕсли;
    
    // 4. Создаем макет компоновки данных на основе схемы и наших настроек
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
    
    // 5. Инициализируем процессор компоновки данных
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // 6. Инициализируем процессор вывода в табличный документ
    // Перед выводом рекомендуется очищать табличный документ
    ТДНедооформленныеЗаявки.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТДНедооформленныеЗаявки);
    
    // 7. Выполняем вывод результата
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Что делать, если данные всё равно не появляются?

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

Рассмотрим основные причины:

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

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

← На главную