В процессе разработки управляемых форм часто возникает необходимость отображать списки документов или справочников, отфильтрованные по конкретным критериям. Например, при открытии карточки сотрудника в конфигурации «1С:Зарплата и управление персоналом» требуется вывести список договоров ГПХ (ДГПХ), относящихся к данному физическому лицу, у которых установлен определенный способ оплаты (например, «По актам выполненных работ»).
Рассмотрим, как правильно настроить такой отбор в динамическом списке с произвольным запросом и какие способы решения существуют в платформе 1С:Предприятие 8.3.
Разберем по шагам, как добавить дополнительные элементы отбора через программное управление настройками компоновщика данных динамического списка.
Для настройки отбора по нескольким полям создадим процедуру установки отбора в модуле формы. В этой процедуре мы последовательно добавляем элементы в коллекцию отборов динамического списка.
Посмотрим на пример кода установки отбора по сотруднику и значению перечисления:
Процедура ДинамСписокДГПХУстановитьОтбор()
// Очищаем коллекцию перед добавлением, чтобы избежать дублирования
СписокДГПХ.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Очистить();
// Отбор по сотруднику
ОтборСотрудник = СписокДГПХ.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСотрудник.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сотрудник");
ОтборСотрудник.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборСотрудник.ПравоеЗначение = Объект.Ссылка;
ОтборСотрудник.Использование = Истина;
ОтборСотрудник.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
// Отбор по способу оплаты (перечислению)
ОтборСпособОплаты = СписокДГПХ.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСпособОплаты.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СпособОплаты");
ОтборСпособОплаты.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборСпособОплаты.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.СпособыОплатыПоДоговоруГПХ.ПоАктамВыполненныхРабот");
ОтборСпособОплаты.Использование = Истина;
ОтборСпособОплаты.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецПроцедуры
Обратим внимание на следующие ключевые моменты при работе с этим методом:
ПравоеЗначение передается результат работы функции ПредопределенноеЗначение(...) с полным именем предопределенного элемента.ВЫБРАТЬ, в настройках динамического списка обязательно должно быть заполнено свойство ОсновнаяТаблица (например, Документ.ДоговорРаботыУслуги).ФиксированныеНастройки.Отбор, чтобы пользователь не мог случайно сбросить их через интерфейсную настройку списка (кнопка «Еще» — «Настроить список»).Проанализируем альтернативный подход, который является наиболее производительным. Если условие по способу оплаты является жестким и не должно меняться динамически, его лучше прописать непосредственно в тексте запроса динамического списка с использованием параметров.
Текст произвольного запроса динамического списка в этом случае будет выглядеть так:
ВЫБРАТЬ
ДоговорРаботыУслуги.Ссылка КАК Ссылка,
ДоговорРаботыУслуги.ДатаНачала КАК ДатаНачала,
ДоговорРаботыУслуги.ДатаОкончания КАК ДатаОкончания
ИЗ
Документ.ДоговорРаботыУслуги КАК ДоговорРаботыУслуги
ГДЕ
ДоговорРаботыУслуги.Сотрудник = &Сотрудник
И ДоговорРаботыУслуги.СпособОплаты = ЗНАЧЕНИЕ(Перечисление.СпособыОплатыПоДоговоруГПХ.ПоАктамВыполненныхРабот)
При таком подходе в модуле формы при вызове события ПриСозданииНаСервере потребуется установить значение только одного параметра:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Элементы.ДинамСписокДГПХ.Параметры.УстановитьЗначениеПараметра("Сотрудник", Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
Выясним основные риски и потенциальные проблемы, с которыми сталкиваются разработчики при настройке динамических списков:
Объект.Ссылка содержит пустую ссылку. Установка отбора по пустой ссылке приведет к отображению некорректных данных. Всегда проверяйте заполненность ссылки с помощью функции ЗначениеЗаполнено(). Для нового объекта отбор следует обновлять после его первой записи.Отбор.Элементы.Добавить() будет добавлять дублирующие условия. Перед формированием отбора вызывайте Отбор.Элементы.Очистить().