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