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