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