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

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

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

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

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

Рассмотрим ключевую особенность: этот механизм работает на стороне тонкого клиента. Это означает, что фильтрация происходит в памяти клиентского приложения, не затрагивая данные на сервере. Это обеспечивает высокую скорость работы интерфейса, но накладывает определенные ограничения на сложность условий отбора (только строгое равенство).

Установка программного отбора

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

Проанализируем пример кода:


&НаКлиенте
Процедура УстановитьФильтр(Команда)
    // Предположим, что переменная ТекущийМаршрут содержит ссылку на справочник
    ПараметрыОтбора = Новый Структура("Маршрут", ТекущийМаршрут);
    ФиксОтбор = Новый ФиксированнаяСтруктура(ПараметрыОтбора);
    
    Элементы.ТаблицаЗаказов.ОтборСтрок = ФиксОтбор;
КонецПроцедуры

В данном случае в таблице ТаблицаЗаказов останутся только те строки, значение в колонке Маршрут которых совпадает с переданным параметром. Если нам нужно наложить отбор по нескольким полям одновременно (логическое "И"), мы просто добавляем их в структуру:


&НаКлиенте
Процедура ФильтрПоДвумПолям(Команда)
    СтруктураПолей = Новый Структура;
    СтруктураПолей.Вставить("Статус", ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Новый"));
    СтруктураПолей.Вставить("Ответственный", Объект.Менеджер);
    
    Элементы.ТаблицаЗаказов.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураПолей);
КонецПроцедуры

Проблема отмены отбора и ее решение

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

Рассмотрим типичную ситуацию: разработчик нажимает кнопку очистки или удаляет значение в поле фильтра, но строки не возвращаются. Это часто происходит из-за того, что после очистки срабатывают дополнительные обработчики событий (например, ПриИзменении), которые снова накладывают пустой отбор, ошибочно интерпретируя отсутствие значения как условие поиска пустой ссылки.

Посмотрим на правильную реализацию очистки в обработчике события Очистка:


&НаКлиенте
Процедура ПолеМаршрутОчистка(Элемент, СтандартнаяОбработка)
    // Отменяем стандартную обработку, если хотим полностью контролировать процесс
    СтандартнаяОбработка = Ложь;
    Объект.Маршрут = Неопределено;
    
    // Снимаем отбор
    Элементы.ТаблицаЗаказов.ОтборСтрок = Неопределено;
КонецПроцедуры

Универсальный подход к фильтрации

Для обеспечения стабильной работы интерфейса рекомендуется использовать единую процедуру для установки и снятия отбора, которая проверяет заполненность критериев — для этой задачи есть универсальный механизм настройки и применения фильтров 1С. Разберем этот подход:


&НаКлиенте
Процедура ОбновитьВидимостьСтрок()
    Если ЗначениеЗаполнено(Объект.ФильтрМаршрут) Тогда
        Элементы.Таблица.ОтборСтрок = Новый ФиксированнаяСтруктура("Маршрут", Объект.ФильтрМаршрут);
    Иначе
        // Если поле фильтра пустое — показываем все строки
        Элементы.Таблица.ОтборСтрок = Неопределено;
    КонецЕсли;
КонецПроцедуры

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

Дополнительные нюансы и тонкости

Проанализируем ситуации, которые могут усложнить работу с ОтборСтрок:

  1. Регистр имен колонок: Хотя язык 1С нечувствителен к регистру, при создании ФиксированнаяСтруктура рекомендуется строго соблюдать соответствие имен ключей именам колонок.
  2. Взаимодействие с пользовательским поиском: Если пользователь воспользовался стандартным поиском Ctrl+F, программный ОтборСтрок будет наложен поверх него. В итоге пользователь увидит только те строки, которые удовлетворяют обоим условиям одновременно. Очистка программного отбора не сбросит фильтр, установленный пользователем вручную.
  3. Работа с иерархией: Если ваша таблица на форме является деревом значений, помните, что ОтборСтрок применяется только к строкам, которые "видны" на текущем уровне. Механизм не предназначен для сложной рекурсивной фильтрации всей иерархии сверху вниз.
  4. Типы данных: Отбор работает исключительно на равенство. Вы не сможете использовать условия типа "больше", "меньше" или "в списке". Если вам нужен сложный фильтр, добавьте в таблицу скрытую колонку типа Булево (например, ПодходитПодУсловие), рассчитайте ее значение программно для каждой строки, а затем установите ОтборСтрок по этой колонке со значением Истина — в этом поможет обработка для настройки условий и отборов данных.

Нужно ли вызывать метод Обновить()?

В некоторых обсуждениях встречается совет использовать Элементы.Таблица.Обновить() после изменения отбора. В большинстве случаев в современных версиях платформы 8.3 это излишне. Платформа автоматически отслеживает изменение свойства ОтборСтрок и инициирует перерисовку интерфейса. Лишние вызовы Обновить() могут привести к кратковременному "миганию" интерфейса и замедлению работы при больших объемах данных.

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

← На главную