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

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

Работа с динамическими списками — одна из самых распространенных задач при разработке на платформе 1С:Предприятие 8.3 — поможет консоль для отладки динамических списков. Часто возникает ситуация, когда при открытии формы списка или по нажатию определенной кнопки необходимо отфильтровать данные по какому-либо критерию. При этом система настроек динамического списка настолько гибка, что позволяет программно реализовать практически любое требование к отображению данных.

В этой статье мы подробно разберем, как правильно управлять отборами динамического списка через встроенный язык, проанализируем структуру объекта ДинамическийСписок и рассмотрим различные варианты решения этой задачи. Для этой задачи есть пошаговая отладка кода в режиме Предприятия.

Понимание структуры настроек Динамического Списка

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

У реквизита формы типа ДинамическийСписок есть важное свойство — КомпоновщикНастроек. Именно через него происходит управление всеми визуальными настройками списка: отборами, сортировкой, группировкой и условным оформлением.

Внутри компоновщика настроек есть две коллекции, которые нас интересуют:

  1. Фиксированные настройки (FixedSettings) — это настройки, которые устанавливаются разработчиком и которые пользователь не может изменить в стандартном окне "Настроить список". Обычно именно они используются для жестких программных отборов.
  2. Пользовательские настройки (UserSettings) — это те настройки, которые отображаются пользователю в шапке формы (если включен режим быстрого доступа) или в окне "Еще - Настроить список".

Разберем способы работы с каждой из этих коллекций.

Способ 1: Установка фиксированного отбора (FixedSettings)

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

Нам необходимо выполнить следующие действия:

  1. Найти нужный элемент отбора в коллекции или создать новый.
  2. Указать левое значение (поле, по которому фильтруем).
  3. Указать вид сравнения (Равно, ВСписке, Содержит и т.д.).
  4. Указать правое значение (то, с чем сравниваем).
  5. Включить использование отбора.

Посмотрим на пример кода, реализующий этот подход:


// Пример: Отбор списка товаров по виду номенклатуры "Товар"
&НаСервере
Процедура УстановитьОтборПриСоздании()
    
    // Получаем доступ к коллекции элементов отбора фиксированных настроек
    КоллекцияОтборов = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы;
    
    // Очищаем старые отборы, если это необходимо
    // КоллекцияОтборов.Очистить(); 

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

КонецПроцедуры

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

Способ 2: Установка отбора в пользовательских настройках (UserSettings)

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

Элементы в ПользовательскиеНастройки связаны с элементами в основных настройках через идентификаторы (UserSettingID). Рассмотрим более простой и надежный вариант работы с пользовательскими настройками:


&НаСервере
Процедура УстановитьПользовательскийОтбор(ИмяПоля, Значение)

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

    Если ЭлементОтбора <> Неопределено Тогда
        ИДНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки;
        НайденнаяНастройка = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИДНастройки);
        
        Если НайденнаяНастройка <> Неопределено Тогда
            НайденнаяНастройка.ПравоеЗначение = Значение;
            НайденнаяНастройка.Использование = Истина;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Способ 3: Использование БСП (Библиотеки Стандартных Подсистем)

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

Воспользуемся модулем ОбщегоНазначенияКлиентСервер:


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

КонецПроцедуры

Использование группы ИЛИ / И

Для реализации логики "ИЛИ" (например, когда нужно отобрать записи по нескольким складам одновременно) необходимо создать группу элементов отбора. Это особенно актуально, если в списке реализована сложная визуализация, такая как флажки в динамическом списке на управляемых формах, требующая точного управления набором данных — помогут индикаторы и иконки для журналов документов.


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

Распространенные ошибки и нюансы

  1. Неверные типы данных. Тип ПравоеЗначение должен строго соответствовать типу поля.
  2. Путаница с именами полей. Используйте только те имена, которые определены в схеме запроса.
  3. Вид сравнения "ВСписке". Требует передачи массива или списка значений.
  4. Очистка отборов. При повторной установке отборов не забывайте удалять старые, чтобы избежать их дублирования.

Параметры запроса vs Отборы

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

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

← На главную