Как правильно настроить программный отбор в табличной части управляемой формы 1С и исправить ошибку «Реквизит не найден»

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

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

Разберем детально, почему возникает эта проблема, как устроены механизмы фильтрации таблиц на форме и какими способами можно реализовать требуемую функциональность.

Анализ причины проблемы

Выясним причину, по которой платформа 1С выдает ошибку при попытке выполнить следующий код:


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

В управляемой форме элемент управления «Таблица формы» (в данном случае Элементы.Участки), связанный с табличной частью объекта, имеет свойство ОтборСтрок. Это свойство принимает значение типа ФиксированнаяСтруктура или Неопределено.

Ключевое ограничение механизма заключается в следующем: ключами структуры отбора могут выступать только имена реальных реквизитов самой табличной части (объекта или формы). Платформа 1С не поддерживает обращение через свойство ОтборСтрок к вычисляемым полям, элементам формы (колонкам) или реквизитам адресованных объектов через точку (таким как Участок.ПостоянноеПроживание).

Ограничения свойства «ОтборСтрок»

Проанализируем особенности работы свойства ОтборСтрок в платформе 1С:

  1. Типы условий: поддерживает только строгое равенство (для нестроковых типов) и поиск по вхождению подстроки (для строк). Нельзя задавать сложные виды сравнения (например, «В списке», «Не равно», «Больше»).
  2. Вызов сервера: установка или сброс значения ОтборСтрок на клиенте влечет за собой неявный контекстный вызов сервера.
  3. Обновление данных: при программном изменении состава или значений строк табличной части отбор необходимо переустанавливать повторно для корректного пересчета видимости строк.

Способ 1. Добавление реквизита в табличную часть (рекомендуемый подход)

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

Разберем по шагам алгоритм реализации:

  1. Добавляем реквизит ПостоянноеПроживание в табличную часть.
  2. В событии ПриИзменении для колонки Участок программно заполняем этот реквизит значением из справочника.
  3. Налагаем отбор по прямому реквизиту табличной части.

Пример кода для события изменения реквизита фильтрации на форме:


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

Для отключения отбора достаточно передать пустую строку в качестве значения ключа либо присвоить свойству ОтборСтрок значение Неопределено.

Способ 2. Использование механизмов условного оформления

Посмотрим на альтернативный способ, который не требует изменения структуры реквизитов табличной части. Если поле выведено на форму «через точку» (например, Объект.Участки.Участок.ПостоянноеПроживание), с ним умеет работать механизм УсловноеОформление формы.

Этот вариант подходит, когда нужно визуально скрыть строки, не подходящие под условие:

  1. Открываем свойства формы и переходим в раздел УсловноеОформление.
  2. Добавляем элемент оформления и задаем условие: Объект.Участки.Участок.ПостоянноеПроживание Равно Ложь.
  3. В оформляемых полях указываем все колонки таблицы Участки.
  4. В установках оформления выбираем свойство Отображать со значением Ложь или задаем специфическое выделение цветом.

Обратите внимание: Условное оформление скрывает видимость строк на форме, но строки остаются в коллекции данных Объект.Участки на клиенте и сервере.

Способ 3. Переход на Динамический список

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

В динамическом списке отбор настраивается через элемент КомпоновщикНастроек:


ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Участок.ПостоянноеПроживание");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;

Способ 4. Использование буферной таблицы значений на форме

Если данные редактируются во вспомогательной обработке и их можно временно хранить в памяти, проанализируем вариант с использованием промежуточной таблицы значений:

  1. Полный массив данных храним во вспомогательном реквизите формы с типом ТаблицаЗначений.
  2. При изменении условий отбора вызываем метод НайтиСтроки() по исходной коллекции с нужной структурой отбора.
  3. Очищаем отображаемую на форме таблицу и загружаем в нее только найденные строки.

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

← На главную