Почему при программном выводе отчета СКД не применяется макет оформления и как это исправить?

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

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

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

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

Выясним причину: почему не работает СКД.НастройкиПоУмолчанию

Типичный код программного формирования отчета часто выглядит следующим образом:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ДокументРезультат.Очистить();
    
    СКД = ПолучитьМакет("Макет");
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, СКД.НастройкиПоУмолчанию, ДанныеРасшифровки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

При таком подходе оформление отчета может отсутствовать по следующим причинам:

  1. Неполная инициализация через СКД.НастройкиПоУмолчанию: данное свойство возвращает сырую структуру настроек по умолчанию из схемы. В этой структуре системные параметры вывода (включая параметр «Макет оформления») могут не иметь признака активности Использование = Истина.
  2. Особенности значения «Основной»: для компоновщика макета значение макета оформления «Основной» без явного источника доступных настроек и контекста формы воспринимается как базовый вывод без применения стилей и заливок.
  3. Работа с неосновной схемой: если в отчете используется несколько макетов СКД, стандартный КомпоновщикНастроек объекта отчета связан только с основной схемой. Передача его настроек во второй макет приводит к ошибкам структуры, а использование СКД2.НастройкиПоУмолчанию сбрасывает оформление.

Рассмотрим по шагам все варианты правильной реализации программного вывода с сохранением оформления.

Способ 1. Инициализация отдельного компоновщика настроек для неосновной СКД

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


СКД2 = ПолучитьМакет("ВтораяСКД");

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

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

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

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

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

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

В этом случае платформа корректно инициализирует все параметры вывода, и системный макет оформления (включая «Основной») применится в полном объеме.

Способ 2. Явная передача макета оформления в метод «Выполнить»

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

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

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


СКД = ПолучитьМакет("Макет");
Настройки = СКД.НастройкиПоУмолчанию;

// Получаем макет оформления из метаданных отчета или общих макетов
МакетОформления = ПолучитьМакет("МакетОформления"); 

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

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

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

Способ 3. Программная активация параметра макета оформления

Если мы работаем с настройками напрямую, можно принудительно найти параметр вывода «Макет оформления» и включить его использование в коде:


НастройкиОтчета = СКД.НастройкиПоУмолчанию;

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиОтчета, ДанныеРасшифровки);

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

← На главную