Почему не работает ОтборСтрок табличной части в управляемых формах 1С 8.3 и как это исправить?

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

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

Разберем базовый синтаксис и правила использования

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

Рассмотрим классический пример установки отбора по реквизиту Магазин:


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

На первый взгляд код выглядит абсолютно корректным, однако на практике он часто дает сбои. Выясним основные причины подобного поведения платформы.

Причина 1: Колонка отсутствует в элементах формы

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

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

Решение: Добавьте реквизит в таблицу формы. Если отображать колонку пользователю не требуется, программно или в свойствах элемента установите свойство Видимость = Ложь. Главное — физическое присутствие элемента в структуре формы.

Причина 2: Попытка отбора по реквизитам «через точку»

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

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

Причина 3: Ошибки сопоставления типов данных

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

Проанализируем правила сопоставления типов:

  1. Для ссылочных типов данных платформа сравнивает уникальные идентификаторы (UUID). Если вы передадите в отбор Строка(ВыбранныйМагазин) вместо ссылки, типы данных не совпадут (строка и ссылка), и результатом фильтрации станет пустая таблица.
  2. Для строковых типов данных сравнение действительно идет по вхождению подстроки (поведение системы начиная с версии 8.2). То есть при отборе строки "Склад 1" в выборку попадут также "Склад 10" и "Склад 11". Помните об этой особенности при работе со строками.

Причина 4: Сбои при динамическом изменении данных

Если данные в табличной части изменяются программно (например, при вызове серверного метода строки удаляются или добавляются новые), установленный на клиенте отбор может перестать работать или скрыть актуальные данные. Метод Элементы.Поступления.Обновить() не всегда принудительно заставляет платформу перестроить визуальный список строк с учетом наложенного фильтра.

Надежный обходной путь: Для гарантированного обновления визуального представления на клиенте используйте схему со сбросом отбора перед его повторным заполнением:


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

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

Альтернативные варианты: когда возможностей ОтборСтрок недостаточно

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

В таких сценариях мы рекомендуем использовать альтернативные методы решения задачи:

  1. Программное Условное Оформление (УО): Мы можем добавить элемент условного оформления для формы, где условием будет наше сложное выражение, а оформлением — свойство Видимость = Ложь. Платформа визуально скроет ненужные строки от пользователя.
  2. Использование вспомогательной Таблицы Значений (ТЗ): Данные табличной части выгружаются в промежуточный массив или ТЗ на сервере, там они гибко фильтруются стандартными методами платформы, а затем отфильтрованный результат загружается обратно в форму для отображения пользователю.

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

← На главную