Как правильно установить программный отбор строк в таблице управляемой формы 1С?

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

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

Анализ ошибки: почему не работает обращение через Значение и ВидСравнения

Рассмотрим типичный ошибочный фрагмент кода, с которым сталкиваются начинающие разработчики:


текСтр = Элемент.ТекущиеДанные;
Если текСтр <> Неопределено Тогда
    Элементы.СписокЗаказов.ОтборСтрок.Контрагент.Значение = текСтр.Контрагент;
    Элементы.СписокЗаказов.ОтборСтрок.Контрагент.ВидСравнения = ВидСравнения.Равно;
    Элементы.СписокЗаказов.ОтборСтрок.Контрагент.Использование = Истина;
КонецЕсли;

При выполнении такого кода платформа выдает ошибку о том, что поле не найдено, а в отладчике свойство ОтборСтрок имеет значение Неопределено. Выясним причину такого поведения.

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

Корректная установка простого отбора строк

Чтобы установить фильтрацию строк по конкретной колонке, необходимо создать и присвоить свойству ОтборСтрок объект типа ФиксированнаяСтруктура, где ключом выступает имя колонки таблицы, а значением — искомое значение.

Посмотрим на рабочий пример установки отбора по текущей строке:


текСтр = Элемент.ТекущиеДанные;
Если текСтр <> Неопределено Тогда
    Элементы.СписокЗаказов.ОтборСтрок = Новый ФиксированнаяСтруктура("Контрагент", текСтр.Контрагент);
КонецЕсли;

Данный код мгновенно отфильтрует строки таблицы на стороне клиента без вызова серверных процедур.

Установка множественного отбора по нескольким колонкам

Если требуется применить фильтрацию сразу по нескольким колонкам, разберем по шагам, как это реализовать:

  1. Создаем обычный объект Структура и наполняем его необходимыми полями и значениями.
  2. Передаем созданную структуру в конструктор ФиксированнаяСтруктура.
  3. Присваиваем полученную фиксированную структуру свойству ОтборСтрок таблицы формы.

Посмотрим на пример установки отбора по контрагенту и статусу заказа:


СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Контрагент", текСтр.Контрагент);
СтруктураОтбора.Вставить("Проведен", Истина);

Элементы.СписокЗаказов.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбора);

Сброс и очистка установленного отбора

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

Элементы.СписокЗаказов.ОтборСтрок = Неопределено;

Особенности и ограничения свойства ОтборСтрок

При использовании свойства ОтборСтрок важно учитывать следующие технические особенности платформы:

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

Альтернативные подходы при сложных условиях отбора

Проанализируем ситуации, когда стандартного свойства ОтборСтрок недостаточно:

  1. Работа с динамическими списками: если таблица формы отображает ДинамическийСписок, свойство ОтборСтрок использовать нельзя. Для динамических списков отбор устанавливается через компоновщик настроек: Список.Отбор.Элементы или через параметры запроса динамического списка.
  2. Сложные условия (ИЛИ, списки значений, диапазоны): для таблиц значений и табличных частей сложные выборки реализуются на сервере с помощью метода НайтиСтроки(), запросов к временным таблицам или фильтрации исходного массива с последующей перезагрузкой данных в реквизит формы.
  3. Визуальное скрытие или оформление: если требуется визуально выделить определенные строки или скрыть их по сложным правилам, рекомендуется использовать механизм УсловноеОформление формы.
← На главную