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