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