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