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

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

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

Почему прямой отбор может не работать

Проанализируем типичные ошибки при установке фильтров на динамический список:

  1. Перезапись пользовательскими настройками формы: при инициализации формы платформа считывает сохраненные пользовательские настройки, которые могут переопределить отборы, добавленные напрямую в коллекцию Настройки.Отбор.
  2. Пустое значение для сравнения: если правое значение отбора формируется функцией поиска (например, НайтиПоНаименованию), при отсутствии совпадений вернется пустая ссылка, из-за чего список отобразит пустой результат или отфильтрует данные некорректно.
  3. Особенности иерархических отборов: вид сравнения ВИерархии требует, чтобы поле было ссылочного типа, а в динамическом списке была явно определена основная таблица либо корректно сформирован запрос.
  4. Специфика типовых конфигураций (ERP, КА, УТ): в типовых решениях дерево иерархии номенклатуры может управляться встроенными процедурами при смене активной строки или обновлении формы, перетирая ручные настройки разработчика.

Способ 1. Использование встроенных функций БСП

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


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

В более ранних версиях БСП применялась процедура из специализированного модуля отборов. Посмотрим на ее реализацию:


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

Способ 2. Установка через фиксированные настройки динамического списка

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


ЭлементОтбора = ИерархияНоменклатуры.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

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

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

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


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

Способ 4. Фильтрация через параметры динамического списка

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

Добавим в текст запроса динамического списка условие:


ГДЕ
    ТаблицаНоменклатуры.Ссылка В ИЕРАРХИИ (&РодительскийЭлемент)

Затем в коде формы передадим значение параметра:


ИерархияНоменклатуры.Параметры.УстановитьЗначениеПараметра("РодительскийЭлемент", ГруппаПродукция);

Выбор конкретного метода зависит от архитектуры формы: для типовых конфигураций рекомендуется использовать методы БСП или фиксированные настройки, а для нестандартных произвольных запросов — установку параметров.

← На главную