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