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

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

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

Понимаем структуру динамического списка

Динамический список в управляемом приложении — это мощный инструмент, который использует систему компоновки данных (СКД). Чтобы программно управлять его настройками, нам необходимо обратиться к объекту КомпоновщикНастроек. Рассмотрим два основных свойства компоновщика, которые отвечают за отборы:

  1. ФиксированныеНастройки (FixedSettings) — отборы, установленные здесь, применяются "жестко". Пользователь в режиме Предприятия не может их отключить или изменить через стандартное меню "Еще - Настроить список". Это идеальный вариант для отборов по правам доступа или логике работы конкретной формы (например, форма выбора товаров только определенной группы).
  2. ПользовательскиеНастройки (UserSettings) — это настройки, которые видит и может менять пользователь. Если мы установим отбор здесь, пользователь увидит его в панели отборов и сможет его снять.

Разберем ситуации, когда и какой метод лучше использовать, и проанализируем примеры кода.

Способ 1: Установка фиксированного отбора

Это самый надежный способ скрыть лишние данные от пользователя. Рассмотрим алгоритм действий при открытии формы. Мы будем добавлять новый элемент отбора в коллекцию элементов фиксированных настроек.

Для начала посмотрим на код, который выполняет эту задачу:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем доступ к отборам фиксированных настроек
    ОтборСписка = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
    
    // Создаем новый элемент отбора
    НовыйОтбор = ОтборСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    
    // Указываем поле, по которому будем фильтровать (например, "Склад")
    НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
    
    // Указываем вид сравнения (Равно, ВСписке, Содержит и т.д.)
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    
    // Устанавливаем значение отбора (ссылка на справочник)
    НовыйОтбор.ПравоеЗначение = Справочники.Склады.НайтиПоНаименованию("Основной");
    
    // Обязательно включаем использование отбора
    НовыйОтбор.Использование = Истина;
    
    // Режим отображения (Обычный, Недоступный и т.д.)
    // Недоступный означает, что пользователь не увидит этот отбор в настройках вообще
    НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

КонецПроцедуры

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

Способ 2: Установка отбора в пользовательских настройках

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

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


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

КонецПроцедуры

Заметьте, этот метод сработает только в том случае, если отбор по данному полю уже вынесен в пользовательские настройки (в конфигураторе в свойствах динамического списка стоит галочка включения в пользовательские настройки).

Способ 3: Использование параметров запроса

Если ваш динамический список построен на произвольном запросе, часто эффективнее использовать параметры запроса, а не отборы СКД. Это может работать быстрее на больших объемах данных.

Посмотрим, как это делается:

  1. В тексте запроса динамического списка прописываем условие: ГДЕ Ссылка.Контрагент = &Контрагент.
  2. В модуле формы устанавливаем значение параметра.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Установка параметра динамического списка
    Список.Параметры.УстановитьЗначениеПараметра("Контрагент", Объект.Контрагент);

КонецПроцедуры

Важно: Если параметр используется в запросе, он обязательно должен быть установлен, иначе возникнет ошибка выполнения запроса при открытии формы.

Очистка программных отборов

Перед установкой нового отбора часто требуется очистить старые, чтобы они не накладывались друг на друга (логическое И). Разберем функцию очистки фиксированных настроек.


&НаСервере
Процедура ОчиститьОтборы()
    
    ЭлементыОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы;
    ЭлементыОтбора.Очистить();
    
КонецПроцедуры

Используйте этот метод с осторожностью, если у вас есть другие критически важные отборы, установленные системой. В таком случае лучше удалять конкретный элемент или искать его по имени поля и менять значение.

Группировка условий (И / ИЛИ)

Иногда задача сложнее: нужно отобрать документы, где Склад = Склад1 ИЛИ Склад = Склад2. Для этого используем группы отборов.

Рассмотрим пример создания группы "ИЛИ":


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

КонецПроцедуры

Распространенные ошибки

При работе с отборами обратите внимание на следующие нюансы:

  1. Неверный тип значения: Если вы передаете строку вместо Ссылки в правое значение, отбор может не сработать или вызвать ошибку, если типы несовместимы.
  2. Забытое свойство Использование: Код может быть верным, но если вы не установили Использование = Истина, отбор будет проигнорирован системой.
  3. Конфликт настроек: Если в конфигураторе установлен отбор по умолчанию, а вы программно добавляете такой же, может возникнуть дублирование условий. Проверяйте наличие отборов перед добавлением.

Используя эти методы, вы сможете гибко управлять отображением данных в управляемых формах 1С, делая интерфейс удобным и функциональным для пользователя.

← На главную