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