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