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