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

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

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

Анализ ошибки инициализации ФиксированнойСтруктуры

Рассмотрим типовую ситуацию. В табличной части документа Товары присутствуют булевы реквизиты: Просроченный, Иностранный, Деревянный, Уцененный. Нам необходимо оставить на форме только те строки, у которых одновременно установлены флаги Просроченный = Истина и Уцененный = Истина.

Частая ошибка заключается в неверной передаче параметров в конструктор:


// Ошибочный вариант:
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Просроченный", "Уцененный", Истина, Истина);

Конструктор ФиксированнаяСтруктура (как и обычный конструктор Структура) принимает имена ключей первым параметром в виде одной строки, где имена разделены запятыми, а затем последовательно передаются их значения. Посмотрим на правильные варианты синтаксиса.

Вариант 1. Прямое создание ФиксированнойСтруктуры через список ключей

Мы можем сразу создать объект ФиксированнаяСтруктура, перечислив названия реквизитов через запятую в первой строке-параметре, а значения передав следующими аргументами:


Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Просроченный, Уцененный", Истина, Истина);

Такой вариант является наиболее компактным и выполняется в одну строку.

Вариант 2. Создание отбора через промежуточную Структуру

Если параметры отбора формируются динамически в зависимости от действий пользователя на форме, удобнее сначала заполнить обычную структуру, а затем передать её в конструктор ФиксированнаяСтруктура. Разберем этот пример:


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

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

Либо с использованием краткого конструктора структуры:


Отбор = Новый Структура("Просроченный, Уцененный", Истина, Истина);
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор);

Особенности и ограничения механизма «ОтборСтрок»

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

  1. Только точное равенство и логическое «И»: свойство ОтборСтрок поддерживает исключительно проверку на строгое равенство (=) и объединяет все поля структуры только по логическому условию «И». Задать условия «ИЛИ», диапазоны («Больше», «Меньше»), отрицание («Не равно») или отбор по списку значений напрямую через ОтборСтрок невозможно.
  2. Сброс отбора: чтобы очистить установленный отбор и снова отобразить все строки таблицы, свойству присваивается значение Неопределено: Элементы.Товары.ОтборСтрок = Неопределено;
  3. Клиентский контекст: установка и очистка свойства ОтборСтрок выполняются в процедурах с директивой &НаКлиенте без лишних обращений к серверу базы данных, что обеспечивает мгновенную реакцию интерфейса.
  4. Визуальный фильтр vs Данные объекта: отбор влияет исключительно на отображение строк в конкретном элементе формы. В коллекции данных формы (Объект.Товары) и на сервере по-прежнему присутствуют все строки. Цикл Для Каждого Строка Из Объект.Товары Цикл обойдет абсолютно все записи, включая скрытые фильтром.
  5. Автозаполнение новых строк: если пользователь нажимает кнопку «Добавить» в таблице с активным фильтром, платформа автоматически заполняет реквизиты новой строки значениями, указанными в установленной фиксированной структуре.

Реализация сложных условий отбора (условие «ИЛИ» и диапазоны)

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

  1. В табличную часть добавляется служебный реквизит, например ОтображатьСтроку с типом Булево.
  2. При изменении критериев поиска или данных таблицы в цикле рассчитывается значение этого флага по необходимому сложному логическому выражению.
  3. На таблицу накладывается простой отбор по служебному полю:
    
    Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("ОтображатьСтроку", Истина);
    
← На главную