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

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

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

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

Установка одиночного отбора в динамическом списке

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

Рассмотрим пошаговое выполнение этой задачи:

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

Пример кода для обработчика ПриСозданииНаСервере:


// МояОрганизация - ссылка на справочник, полученная заранее
Если ЗначениеЗаполнено(МояОрганизация) Тогда
    // Создаем новый элемент отбора
    ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

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

    // Указываем вид сравнения
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

    // Указываем правое значение
    ЭлементОтбора.ПравоеЗначение = МояОрганизация;

    // Активируем отбор
    ЭлементОтбора.Использование = Истина;
КонецЕсли;

Этот код добавит условие, которое будет фильтровать список документов. Важно помнить, что используемое поле («Организация») должно быть выбрано в запросе динамического списка.

Передача параметров для отбора при открытии формы

Часто критерии фильтрации становятся известны только в момент вызова формы. В таких случаях удобно использовать механизм передачи параметров формы.

Процесс передачи и обработки параметров выглядит следующим образом:

  1. Передача параметров. При вызове метода ОткрытьФорму() формируется структура с нужными значениями.
  2. Получение параметров. Внутри открываемой формы данные извлекаются из свойства Параметры.

Пример вызова формы с передачей организации:


ПараметрыОткрытия = Новый Структура("ОрганизацияОтбора", ВыбраннаяОрганизация);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыОткрытия);

Внутри формы списка (в ПриСозданииНаСервере) мы используем эти данные:


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

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

Установка отбора по нескольким значениям ("В списке")

Если требуется отобразить данные сразу по нескольким элементам (например, по списку филиалов), используется вид сравнения ВСписке. Это стандартный прием при работе с множественными отборами в 1С. Если же вам требуется более сложный функционал, например, поиск по шаблону в массиве значений, обратите внимание на расширение Подобно в списке.

Реализация этого метода:

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

Пример кода:


МассивОрганизаций = Новый Массив();
МассивОрганизаций.Добавить(Организация1);
МассивОрганизаций.Добавить(Организация2);

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

Комбинирование нескольких условий отбора

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

Пример простого комбинирования условий:


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

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

Очистка отбора в динамическом списке

Иногда требуется вернуть список в исходное состояние. Существует несколько эффективных способов очистки программных отборов.

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

Чтобы мгновенно удалить все созданные элементы, используйте метод Очистить():


Список.Отбор.Элементы.Очистить();

Это полностью сбросит все фильтры в коллекции Список.Отбор.Элементы.

Удаление конкретного элемента отбора

Если нужно убрать только один фильтр (например, по полю «Организация»), следует итерировать коллекцию и удалять элемент по его идентификатору или левому значению.


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

Важные аспекты и возможные проблемы

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

← На главную