Как программно передать список значений в отбор динамического списка и настроить права доступа?

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

При разработке управляемых форм в 1С часто возникает задача отфильтровать данные динамического списка по динамически вычисляемому списку значений или массиву ссылок. В визуальном редакторе конфигуратора на вкладке Отбор нельзя задать не предопределенный массив в качестве правого значения. Разберем, как правильно передавать динамические массивы в отборы, а также как управлять правами пользователей на отключение таких фильтров.

Способ 1. Установка отбора с помощью функций БСП

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

Рассмотрим пример установки отбора по списку номенклатуры в обработчике формы ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Формируем массив или список значений для отбора
    МассивСсылок = Новый Массив;
    МассивСсылок.Добавить(ПредопределенноеЗначение("Справочник.Номенклатура.Товар1"));
    МассивСсылок.Добавить(ПредопределенноеЗначение("Справочник.Номенклатура.Товар2"));
    
    // Устанавливаем отбор в динамическом списке
    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
        Список,
        "Ссылка",
        МассивСсылок,
        ВидСравненияКомпоновкиДанных.ВСписке,
        "Отбор по разрешенным товарам",
        Истина
    );
    
КонецПроцедуры

Способ 2. Программная работа с компоновщиком настроек без БСП

Если в конфигурации нет БСП или требуется реализовать собственную логику управления отбором, обратимся напрямую к компоновщику настроек динамического списка (Список.КомпоновщикНастроек). Проанализируем, как найти или добавить элемент отбора вручную:


&НаСервере
Процедура УстановитьОтборСписка(ИмяПоля, ЗначениеОтбора)
    
    ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ЭлементОтбора = Неопределено;
    
    // Ищем существующий отбор по полю
    Для Каждого Элемент Из Список.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") И Элемент.ЛевоеЗначение = ПолеОтбора Тогда
            ЭлементОтбора = Элемент;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    // Если элемент не найден, добавляем новый
    Если ЭлементОтбора = Неопределено Тогда
        ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
    КонецЕсли;
    
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Способ 3. Использование произвольного запроса и параметров

Альтернативный подход — переключить динамический список в режим произвольного запроса и передавать массив через параметры компоновщика данных. Разберем этот вариант:

  1. В свойствах динамического списка устанавливаем флаг Произвольный запрос.
  2. В тексте запроса добавляем условие с параметром:
    
    ВЫБРАТЬ
        Таблица.Ссылка КАК Ссылка,
        Таблица.Наименование КАК Наименование
    ИЗ
        Справочник.Номенклатура КАК Таблица
    ГДЕ
        Таблица.Ссылка В (&МассивСсылок)
    
  3. В коде формы передаем сформированный массив в параметры списка:
    
    &НаСервере
    Процедура УстановитьПараметрСписка(МассивСсылок)
        
        Список.Параметры.УстановитьЗначениеПараметра("МассивСсылок", МассивСсылок);
        
    КонецПроцедуры
    

Управление доступом и правами на изменение отборов

Часто требуется сделать так, чтобы определенные пользователи (например, рядовые сотрудники) не могли отключить наложенный фильтр, а администраторы имели возможность управлять им через окно «Настроить список». В платформе 1С нельзя задать права ролей на отборы напрямую в дереве метаданных, но мы можем управлять этим программно.

Рассмотрим два основных механизма разграничения:

  1. Использование фиксированных настроек (ФиксированныеНастройки):

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

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

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

Особенности восстановления пользовательских настроек

Проанализируем важный нюанс: если отбор устанавливается в стандартных настройках динамического списка при открытии формы, платформа может перезаписать его сохраненными пользовательскими настройками.

Чтобы гарантированно сохранить программно установленные значения при повторных открытиях формы, установку динамических отборов рекомендуется выполнять не только в ПриСозданииНаСервере, но и в обработчике формы ПриЗагрузкеПользовательскихНастроекНаСервере.

← На главную