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