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

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

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

Метод 1: Переопределение схемы в процедуре ПриКомпоновкеРезультата

Наиболее надежный и рекомендуемый способ управления схемой — это перехват процесса формирования отчета в модуле объекта. В этом случае мы отключаем стандартную логику платформы и берем управление выводом данных на себя.

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


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

Метод 2: Принудительная инициализация через реквизиты формы

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

Рассмотрим пошагово, как это сделать правильно:

  1. Получаем объект через РеквизитФормыВЗначение("Отчет").
  2. Выбираем нужный макет СКД.
  3. Помещаем схему во временное хранилище, чтобы она была доступна для ИсточникДоступныхНастроекКомпоновкиДанных.
  4. Инициализируем компоновщик настроек.
  5. Возвращаем объект в реквизит формы методом ЗначениеВРеквизитФормы.

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

Важные рекомендации при работе с динамическими схемами

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

Используя предложенные методы, вы сможете создавать гибкие отчеты, которые подстраиваются под требования пользователя, сохраняя при этом все удобства штатных управляемых форм 1С:Предприятие.

← На главную