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