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