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