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

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

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

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

Постановка задачи и выбор события формы

Представим типичную ситуацию: у нас есть форма списка (или произвольная форма с реквизитом типа ДинамическийСписок), и нам нужно установить отбор сразу при ее инициализации.

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

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

Первый и самый распространенный способ — использование коллекции Настройки компоновщика. Этот метод подходит, если мы хотим установить начальный отбор, но оставить пользователю возможность изменить его или отключить вручную через меню "Еще — Настроить список".

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

  1. Обращаемся к реквизиту формы (динамическому списку).
  2. Получаем доступ к его КомпоновщикНастроек.
  3. Обращаемся к свойству Настройки и коллекции Отбор.
  4. Добавляем новый элемент отбора и заполняем его свойства.

Посмотрим на программный код, реализующий эту логику:


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

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

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

Свойство ВидСравнения позволяет нам гибко настраивать логику. Мы можем использовать не только Равно, но и другие варианты:

Способ 2: Использование фиксированных настроек

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

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

Рассмотрим реализацию этого подхода:


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

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

Работа с группировкой отборов (И / ИЛИ)

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

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


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

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

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

Таким образом, в список попадут документы, имеющие любой из двух указанных статусов.

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

При программной работе с динамическими списками мы можем столкнуться с рядом типичных проблем. Давайте разберем их, чтобы избежать ошибок в будущем.

  1. Неверное имя поля. Если вы укажете в ПолеКомпоновкиДанных имя, которого нет в выборке запроса динамического списка, платформа выдаст ошибку во время выполнения или просто не применит отбор. Всегда проверяйте имена полей в конфигураторе.
  2. Использование Элементы.Список.Отбор.... Часто новички пытаются установить отбор через расширение элемента формы (как это делалось в обычных формах для табличного поля). В управляемых формах для ДинамическийСписок этот путь неверен. Все манипуляции должны идти через КомпоновщикНастроек самого реквизита.
  3. Конфликт с пользовательскими настройками. Если вы добавляете отбор в Настройки (не фиксированные), помните, что при открытии формы могут подгрузиться сохраненные настройки пользователя. Ваш программный код в ПриСозданииНаСервере отработает, но в дальнейшем логика может смешаться. Если отбор является критически важным для логики работы окна — используйте ФиксированныеНастройки.

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

← На главную