Как предоставить возможность быстрого отбора по нескольким полям в списке?

В 1С Предприятии 8.2 формы списка объектов конфигурации построены с помощью динамического списка. Пользователь может самостоятельно задать произвольные отборы в любом списке.

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

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

Рассмотрим пример, когда список номенклатуры отбирается по реквизитам списка, соединенным логическим союзом И.

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

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

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



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

&НаКлиенте
Процедура Отфильтровать(Команда)

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

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

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

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

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

В этом обработчике сначала в цикле обходится коллекция всех элементов и групп элементов отбора для основного реквизита формы Список (типа ДинамическийСписок). И удаляются все элементы отбора, созданные программно (Представление = "Программный отбор"). Затем создается группа элементов отбора ГруппаОтбора для реквизита Список с типом логической связи ГруппаИ. И если в полях Производитель и Поставщик содержится не пустая ссылка на справочник, то эти поля добавляются в элементы отбора, принадлежащие группе отбора.

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



При этом закладка Отбор в окне Настройка списка (Все действия - Настроить список...) будет выглядеть следующим образом. В пользовательском режиме сюда можно добавлять другие элементы и группы отбора.



Если задано только одно из полей отбора, то отбор в списке будет выполняться только по одному реквизиту (Производитель или Поставщик).