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

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

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

Разберем подробно, как работает механизм отборов, основанный на системе компоновки данных (СКД), и проанализируем последовательность действий для реализации этой задачи в управляемых формах.

Понимание структуры отбора в динамическом списке

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

Рассмотрим основные свойства, с которыми нам предстоит работать:

  1. ЛевоеЗначение — это поле компоновки данных (например, НоваяСхемаКомпоновкиДанных.Поле("Склад")).
  2. ВидСравнения — определяет логику сопоставления (Равно, В списке, Больше и т.д.).
  3. ПравоеЗначение — конкретное значение или массив значений, с которыми сравнивается поле.
  4. Использование — булево значение, включающее или выключающее данный элемент отбора.

Шаг 1. Поиск и удаление существующих отборов

Прежде чем добавить новый отбор, нам нужно проверить, не был ли он установлен ранее. Если мы будем просто добавлять элементы в цикле, список "засорится" дублями, что приведет к некорректной работе программы. Рассмотрим, как найти и очистить старый отбор по конкретному полю.

Проанализируем пример кода для очистки отбора по полю Контрагент:


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

Обратите внимание, что мы используем проверку ТипЗнч, так как в коллекции могут находиться не только отдельные элементы, но и группы (ГруппаЭлементовОтбораКомпоновкиДанных).

Шаг 2. Программное добавление нового элемента отбора

Теперь рассмотрим процесс создания нового условия. Выясним причину, по которой важно правильно указывать тип поля компоновки. Если мы передадим строку в ЛевоеЗначение, система не поймет, к какому полю динамического списка обращаться. Поэтому мы используем объект ПолеКомпоновкиДанных.

Разберем по шагам добавление отбора:


// Создаем новый элемент в коллекции отборов
НовыйЭлемент = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Указываем поле, по которому будем фильтровать
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

// Устанавливаем вид сравнения (например, Равно)
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

// Указываем значение для фильтрации
НовыйЭлемент.ПравоеЗначение = Объект.Организация;

// Активируем отбор
НовыйЭлемент.Использование = Истина;

// Настраиваем режим отображения (можно скрыть от пользователя)
НовыйЭлемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

В данном примере мы использовали РежимОтображения. Это важный момент: если установить значение в Недоступный, пользователь не сможет изменить или удалить этот отбор через меню "Настроить список". Это критично для жестких бизнес-ограничений (например, разделение доступа по филиалам).

Шаг 3. Использование сложных видов сравнения

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

Посмотрим на пример установки отбора "В списке":


СписокСкладов = Новый Массив;
СписокСкладов.Добавить(СкладОсновной);
СписокСкладов.Добавить(СкладТранзит);

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

Для работы с датами часто используется вид сравнения БольшеИлиРавно (для начала периода) и МеньшеИлиРавно (для окончания). Вы можете добавить два отдельных элемента отбора на одно и то же поле Дата, и система объединит их по логике И.

Работа с группами отборов (И, ИЛИ, НЕ)

Иногда требуется создать сложную логику, например: "Показать документы Контрагента А ИЛИ Контрагента Б, но только те, что не помечены на удаление". Для этого мы проанализируем работу с группами.

Посмотрим на пример реализации условия ИЛИ:


ГруппаИЛИ = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаИЛИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

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

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

Такой подход позволяет создавать иерархические структуры условий любой сложности прямо в коде модуля формы.

Оптимизация и производительность

Важно помнить, что ДинамическийСписок выполняет запрос к базе данных. Каждый установленный программно отбор добавляет условие WHERE (ГДЕ) в SQL-запрос. Чтобы программа работала быстро, придерживайтесь следующих правил:

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

← На главную