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

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

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

Анализ задачи и выбор метода решения

Динамический список в 1С использует механизм Системы Компоновки Данных (СКД). Поэтому работа с отборами в нем отличается от работы с обычными списками значений. Нам необходимо обратиться к компоновщику настроек динамического списка и добавить туда новый элемент отбора.

Разберем основные способы реализации:

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

Будем выполнять все действия в серверной процедуре формы, обычно это ПриСозданииНаСервере.

Способ 1. Использование объектной модели СКД

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

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

Посмотрим на классический пример кода, который добавляет отбор по полю "Менеджер":


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

Разберем важные нюансы этого кода.

Нюанс с пользовательскими настройками:

В современных версиях платформы (8.3.х) существует разделение на Настройки (настройки разработчика) и ПользовательскиеНастройки (то, что пользователь меняет в режиме "Еще - Настроить список").

Если мы добавляем отбор в Список.КомпоновщикНастроек.Настройки, он применится, но пользователь может его не увидеть в быстрой панели отборов. Чтобы отбор гарантированно сработал и корректно отобразился, иногда требуется дублировать логику или использовать идентификаторы пользовательских настроек. Однако для жестких программных отборов, которые пользователь не должен снимать, приведенный выше код является достаточным.

Способ 2. Установка отбора через параметры формы

Если нам нужно открыть форму списка из другого места (например, из документа) с уже установленным отбором, мы можем использовать параметры открытия формы. Платформа 1С позволяет передать структуру Отбор при открытии.

Проанализируем пример вызова:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Контрагент", Объект.Контрагент));

ОткрытьФорму("Документ.ЗаказКлиента.ФормаСписка", ПараметрыФормы);

В этом случае платформа автоматически найдет в динамическом списке поле Контрагент и установит отбор на равенство. Нам не нужно писать код в ПриСозданииНаСервере в самой форме списка.

Способ 3. Использование БСП (Библиотеки Стандартных Подсистем)

Если вы работаете с типовыми конфигурациями (ERP, УТ 11, Бухгалтерия 3.0), настоятельно рекомендуем использовать готовые функции общих модулей. Это сокращает код и уменьшает вероятность ошибок.

Для работы с динамическими списками обычно используется модуль ОбщегоНазначенияКлиентСервер. Посмотрим, как упрощается код:


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

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

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

Иногда задача усложняется: нужно отобрать документы, где Менеджер - текущий пользователь ИЛИ Автор - текущий пользователь. Для этого нам потребуется создать группу отборов.

Разберем реализацию логического "ИЛИ":


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

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

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

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

Проанализируем типичные ошибки, которые возникают при программной установке отборов:

  1. Неверное имя поля: Имя в конструкторе ПолеКомпоновкиДанных должно точь-в-точь совпадать с полем в запросе динамического списка (или в реквизитах объекта). Если используется псевдоним в запросе (ВЫБРАТЬ Ссылка КАК ДокументСсылка), нужно использовать псевдоним.
  2. Забыли свойство Использование: Если создать элемент, но не установить Использование = Истина, отбор не сработает.
  3. Конфликт с пользовательскими настройками: Если вы жестко устанавливаете отбор в коде, а пользователь ранее сохранил свой вариант настроек списка, могут возникнуть наложения. Рекомендуется перед установкой важных отборов программно очищать старые или проверять их наличие.

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

← На главную