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