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

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

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

Базовый способ получения правого значения отбора

Разберем базовое решение, позволяющее получить итоговые настройки динамического списка с учетом всех введенных пользователем отборов. Для этого используется метод элемента формы ПолучитьИсполняемыеНастройкиКомпоновкиДанных().

Проанализируем пример кода:


Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
ЭлементОтбора = Настройки.Отбор.Элементы.Получить(0);
Значение = ЭлементОтбора.ПравоеЗначение;

В данном примере выполняется получение полной коллекции настроек компоновки данных, применяемых к списку в момент вызова. После этого из коллекции отборов берется элемент по индексу 0 и считывается его свойство ПравоеЗначение.

Ограничения и риски обращения по индексу

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

  1. Нестабильность индекса: Порядок элементов отбора зависит от действий пользователя, структуры схемы компоновки и порядка слияния настроек. Если пользователь изменит порядок условий или добавит новый отбор, под индексом 0 окажется другое поле.
  2. Отключенные отборы: Наличие элемента в коллекции отбора не означает, что фильтр активен. Пользователь может снять галочку с отбора в форме. Необходима проверка свойства Элемент.Использование = Истина.
  3. Группировка условий: Элементы отбора могут быть объединены в группы ГруппаЭлементовОтбораКомпоновкиДанных с логическими операторами («И», «ИЛИ», «НЕ»). В таком случае элемент находится во вложенной коллекции.
  4. Тип значения: В зависимости от вида сравнения (например, ВСписке или ВГруппе), свойство ПравоеЗначение может содержать не одиночное значение (ссылку или дату), а СписокЗначений или массив.

Надежный поиск элемента отбора по имени поля

Чтобы избежать ошибок, связанных с изменениями порядка элементов, найдем элемент отбора по имени поля компоновки данных.

Разберем следующий алгоритм обхода коллекции:


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

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

Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), рекомендуется использовать готовые функции обхода, такие как ОбщегоНазначенияКлиентСервер.НайтиЭлементОтбораКомпоновкиДанных(). Это позволяет рекурсивно искать элемент с учетом группировок.

Структура хранения отборов в динамическом списке

Выясним, в каких свойствах реквизита и элемента формы могут храниться настройки отбора:

  1. Список.КомпоновщикНастроек.Настройки.Отбор — отборы, заданные разработчиком в конфигураторе или программно на сервере.
  2. Список.КомпоновщикНастроек.ПользовательскиеНастройки — отборы, которые пользователь добавил или изменил через панель быстрых отборов или окно настройки списка.
  3. Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор — зафиксированные отборы, не подлежащие изменению пользователем.
  4. Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных() — итоговый результат слияния всех перечисленных выше настроек перед выполнением запроса.

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

← На главную