Как программно установить отбор по вычисляемому полю в СКД?

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

При работе со Схемой компоновки данных (СКД) часто возникает задача программно установить фильтр (отбор) для отчета. Для упрощения подобных операций можно использовать СКДБилдер, который значительно сокращает объем кода. Если с обычными полями из набора данных это делается достаточно просто (например, как в примере вывода нескольких отчетов в один табличный документ), то установка отбора по вычисляемому полю, которое создано непосредственно в СКД, требует особого подхода. Прямое обращение к такому полю в коллекции отборов компоновщика настроек может не сработать. Инструменты вроде Пользовательской СКД позволяют глубже изучить возможности настройки отчетов. Разберем, как правильно решить эту задачу.

Анализ проблемы: почему не работает прямой доступ к отбору?

Проанализируем ситуацию. Допустим, у нас есть вычисляемое поле в СКД с именем "СтатусПроверки". Мы пытаемся установить для него отбор следующим образом:


КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

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

Такой код, скорее всего, вызовет ошибку "Поле не найдено", потому что на этапе инициализации компоновщика настроек он "знает" только о полях из наборов данных, но не о вычисляемых полях, которые рассчитываются позже. Система компоновки данных на этом этапе еще не построила полную структуру всех доступных полей, включая вычисляемые.

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

Решение: использование пользовательских настроек СКД

Правильный алгоритм для установки отбора по вычисляемому полю заключается в работе с коллекцией ПользовательскиеНастройки. Рассмотрим пошаговый процесс.

  1. Получаем схему компоновки данных. Это может быть макет из отчета или обработки.
  2. Инициализируем компоновщик настроек. Это стандартный шаг для начала работы с настройками СКД.
  3. Обращаемся к элементу пользовательских настроек. Нам нужен элемент, соответствующий нашему вычисляемому полю. Мы можем найти его по идентификатору. Если вы не задавали идентификатор для элемента пользовательских настроек явно, система сгенерирует его автоматически. Чтобы этого избежать, рекомендуется задавать уникальный идентификатор для отбора по вычисляемому полю прямо в настройках СКД на вкладке "Настройки".
  4. Устанавливаем значения для отбора. Найдя нужный элемент, мы можем установить для него все необходимые свойства: Значение, ВидСравнения и, самое главное, флаг Использование, который включает отбор.

Пример кода для установки отбора

Посмотрим на рабочий пример, который демонстрирует правильный подход. В данном примере мы предполагаем, что в СКД на вкладке "Настройки" уже добавлен элемент отбора для вычисляемого поля "СтатусПроверки" и ему присвоен идентификатор "ОтборПоСтатусу".


// Получаем схему компоновки данных из макета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

// Инициализируем компоновщик настроек
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

// Загружаем стандартные настройки (важно!)
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

// Находим элемент пользовательских настроек по идентификатору
// Идентификатор "ОтборПоСтатусу" должен быть задан в СКД для элемента отбора!
ЭлементПользовательскихНастроек = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти("ОтборПоСтатусу");

Если ЭлементПользовательскихНастроек <> Неопределено Тогда
    // Это ключевой момент. Мы работаем не напрямую с коллекцией отбора,
    // а со свойствами найденного элемента пользовательских настроек.
    
    // Устанавливаем значение для отбора
    ЭлементПользовательскихНастроек.Значение = "Требуется проверка";
    
    // Устанавливаем вид сравнения
    ЭлементПользовательскихНастроек.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    
    // Включаем использование отбора
    ЭлементПользовательскихНастроек.Использование = Истина;

Иначе
    Сообщить("Не найден элемент пользовательских настроек с идентификатором 'ОтборПоСтатусу'!");
КонецЕсли;

// Далее можно формировать отчет с установленными настройками...

Важный момент: если вы не задали идентификатор для элемента отбора в СКД, вам придется искать его в коллекции Элементы по представлению или по пути к данным. Однако использование уникального идентификатора является более надежным и предпочтительным методом.

Вместо поиска элемента можно также использовать специальный метод УстановитьЗначениеПараметра, который является более универсальным способом изменения настроек. Этот метод сам найдет нужный элемент по его имени (ключу) и установит значение.


// Альтернативный и более короткий способ
// В качестве ключа параметра используется путь к данным поля
КлючНастройки = Новый КлючНастроекКомпоновкиДанных("Отбор.Элементы[СтатусПроверки]");

// Устанавливаем свойство "Значение" для этого элемента
КомпоновщикНастроек.ПользовательскиеНастройки.УстановитьЗначениеСвойства(КлючНастройки, "Значение", "Требуется проверка");

// Устанавливаем свойство "Использование"
КомпоновщикНастроек.ПользовательскиеНастройки.УстановитьЗначениеСвойства(КлючНастройки, "Использование", Истина);

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

← На главную