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

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

Описание задачи и причины возникновения

В процессе разработки управляемых форм часто возникает необходимость отображать списки документов или справочников, отфильтрованные по конкретным критериям. Например, при открытии карточки сотрудника в конфигурации «1С:Зарплата и управление персоналом» требуется вывести список договоров ГПХ (ДГПХ), относящихся к данному физическому лицу, у которых установлен определенный способ оплаты (например, «По актам выполненных работ»).

Рассмотрим, как правильно настроить такой отбор в динамическом списке с произвольным запросом и какие способы решения существуют в платформе 1С:Предприятие 8.3.

Способ 1. Добавление программного отбора в компоновщик настроек

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

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

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


Процедура ДинамСписокДГПХУстановитьОтбор()

    // Очищаем коллекцию перед добавлением, чтобы избежать дублирования
    СписокДГПХ.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Очистить();

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

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

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

Обратим внимание на следующие ключевые моменты при работе с этим методом:

  1. Для поля перечисления в свойство ПравоеЗначение передается результат работы функции ПредопределенноеЗначение(...) с полным именем предопределенного элемента.
  2. Если используется отбор по полю реквизита, не выведенному в общую секцию ВЫБРАТЬ, в настройках динамического списка обязательно должно быть заполнено свойство ОсновнаяТаблица (например, Документ.ДоговорРаботыУслуги).
  3. Рекомендуется добавлять системные системно установленные разработчиком отборы в коллекцию ФиксированныеНастройки.Отбор, чтобы пользователь не мог случайно сбросить их через интерфейсную настройку списка (кнопка «Еще» — «Настроить список»).

Способ 2. Ограничение данных непосредственно в тексте запроса

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

Текст произвольного запроса динамического списка в этом случае будет выглядеть так:


ВЫБРАТЬ
    ДоговорРаботыУслуги.Ссылка КАК Ссылка,
    ДоговорРаботыУслуги.ДатаНачала КАК ДатаНачала,
    ДоговорРаботыУслуги.ДатаОкончания КАК ДатаОкончания
ИЗ
    Документ.ДоговорРаботыУслуги КАК ДоговорРаботыУслуги
ГДЕ
    ДоговорРаботыУслуги.Сотрудник = &Сотрудник
    И ДоговорРаботыУслуги.СпособОплаты = ЗНАЧЕНИЕ(Перечисление.СпособыОплатыПоДоговоруГПХ.ПоАктамВыполненныхРабот)

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


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
        Элементы.ДинамСписокДГПХ.Параметры.УстановитьЗначениеПараметра("Сотрудник", Объект.Ссылка);
    КонецЕсли;

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

Важные нюансы и защита от ошибок

Выясним основные риски и потенциальные проблемы, с которыми сталкиваются разработчики при настройке динамических списков:

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