Как программно выбрать и использовать одну из нескольких схем компоновки данных в отчете 1С?

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

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

Анализ проблемы пустого результата

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

Решение 1: Использование вложенных схем компоновки данных

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

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

Разберем пример кода для переключения между наборами данных:


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

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

Решение 2: Программная смена макета схемы

Если ваши схемы настолько разные, что объединение их в один НаборДанных невозможно или нецелесообразно, вы можете подменять саму схему, но при этом необходимо обязательно обновлять Настройки компоновщика:

  1. Получите макет схемы методом ПолучитьМакет.
  2. Загрузите настройки из выбранной схемы с помощью метода КомпоновщикНастроек.ЗагрузитьНастройки(), чтобы параметры и структура данных соответствовали именно этой схеме.
  3. Примените значения параметров только после загрузки настроек схемы.

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

Рекомендации по стабильной работе отчетов

Чтобы ваш отчет работал корректно в любых условиях, обратите внимание на следующие рекомендации:

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

← На главную