1С:Предприятие 8
Система программ

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

25.06.2012

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

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

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

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

Допустим, в конфигурации существуют справочники ПроизводителиПоставщики и справочник Номенклатура с реквизитами:

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

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

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

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

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

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

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

  

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

  

Выполнив команду Подробно из контекстного меню мы увидим оба условия отбора. В пользовательском режиме сюда можно добавлять другие элементы и группы отбора:

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

Скачать демонстрационный пример (платформа 8.2.15.317) .