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