Как программно получить параметры отбора из открытой формы списка справочника

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

В практике разработчика 1С часто возникает задача: прочитать настройки, которые пользователь установил в открытой форме списка. Это может понадобиться для формирования связанного отчета, выгрузки данных или анализа текущего состояния интерфейса из внешней обработки. Сложность задачи заключается в том, что механизмы работы с фильтрами существенно различаются в зависимости от типа используемых форм — Обычных или Управляемых. Рассмотрим подробно оба варианта, а также разберем способ получения ссылки на саму открытую форму.

Поиск открытой формы в приложении

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

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


// Получаем все открытые окна
ОкнаПриложения = ПолучитьОкна();

Для Каждого ОкноПриложения Из ОкнаПриложения Цикл
    // Проверяем содержимое окна, так как в одном окне может быть несколько форм
    Для Каждого ФормаОкна Из ОкноПриложения.Содержимое Цикл
        // Ищем форму по её имени (например, Справочник.Номенклатура.ФормаСписка)
        Если ФормаОкна.ИмяФормы = "Справочник.Товары.ФормаСписка" Тогда
            НужнаяФорма = ФормаОкна;
            // Здесь мы можем вызывать функции получения отбора
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Важно помнить, что метод ПолучитьОкна() доступен только на клиенте. Если вам нужно передать данные отбора на сервер, сначала соберите их в структуру или таблицу значений на стороне клиента.

Работа с обычными формами (Толстый клиент)

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

Каждый элемент отбора в обычном списке имеет три ключевых свойства, которые нам нужно проанализировать:

  1. Использование — флаг, указывающий, активирован ли данный фильтр пользователем.
  2. ВидСравнения — тип операции (равно, в списке, содержит и т.д.).
  3. Значение — собственно данные, по которым идет фильтрация.

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


// Допустим, переменная ФормаСписка содержит ссылку на найденную форму
Для Каждого ЭлементОтбора Из ФормаСписка.СправочникСписок.Отбор Цикл
    Если ЭлементОтбора.Использование Тогда
        Сообщить("Поле: " + ЭлементОтбора.ПутьКДанным);
        Сообщить("Вид сравнения: " + ЭлементОтбора.ВидСравнения);
        Сообщить("Значение: " + ЭлементОтбора.Значение);
    КонецЕсли;
КонецЦикла;

Особенности обычных форм: Если пользователь добавил новое поле в отбор через стандартный диалог "Настройка отбора", оно также появится в коллекции Отбор. Нам не нужно заранее знать имена всех полей, достаточно перебора коллекции.

Работа с управляемыми формами (Тонкий и Веб-клиент)

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

Чтобы получить полную картину того, что видит пользователь, нам нужно обратиться к объекту КомпоновщикНастроек. Рассмотрим, как программно извлечь элементы отбора:


// Получаем настройки динамического списка (имя основного реквизита обычно "Список")
Настройки = ФормаСписка.Список.КомпоновщикНастроек.ПолучитьНастройки();

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

Выясним важную деталь: часто программный код не видит отборы, если они были установлены через меню "Настроить список". В этом случае данные попадают в ПользовательскиеНастройки. Чтобы гарантированно получить актуальное состояние, рекомендуется использовать метод ПолучитьИсполняемыеНастройкиДанных(), если доступен контекст компоновки, или анализировать коллекцию Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.

Нюансы и практические советы

Разберем ситуации, которые могут усложнить получение данных:

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

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

← На главную