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

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

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

Применение свойства «ОтборСтрок» элемента таблицы формы

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

В этой структуре ключом выступает имя реквизита табличной части, а значением — критерий, по которому нужно выполнить отфильтровывание.

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


&НаКлиенте
Процедура УстановитьОтборПоСтроке()

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

КонецПроцедуры

Как корректно отключать и очищать отбор

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

Пример очистки отбора на клиенте:


&НаКлиенте
Процедура ОчиститьОтборТабличнойЧасти()
    Элементы.ТаблицаТовары.ОтборСтрок = Неопределено;
КонецПроцедуры

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

Особенности и скрытые механизмы работы свойства «ОтборСтрок»

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

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

Альтернативные способы реализации сложных отборов

Если штатного свойства ОтборСтрок недостаточно (например, требуется отбор «В списке» или по условию «ИЛИ»), проанализируем альтернативные подходы:

  1. Отображение через временный реквизит формы типа «ТаблицаЗначений»:

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

  2. Отображение через «ДанныеФормыДерево»:

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

  3. Динамический список с источником-запросом:

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

Ограничение условного оформления: Попытка использовать «Условное оформление» формы с настройкой Видимость = Ложь для не подходящих под условие строк не решает задачу. Условное оформление управляет видимостью ячеек (полей), но не скрывает строку полностью — вместо нее на форме остается пустая полоса.

← На главную