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