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