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