Как реализовать «Состояние просмотра» для обычной таблицы на управляемых формах?

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

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

Почему стандартный механизм не работает для таблиц?

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

Обычная таблица на форме — это просто коллекция данных в памяти (данные формы коллекция). У нее нет встроенного построителя отчетов или механизма СКД, который бы отслеживал действия пользователя через стандартные команды поиска (например, Ctrl+F). Поэтому нам придется реализовывать этот функционал самостоятельно.

Способ 1. Имитация панели через декорации и группы

Рассмотрим самый визуально близкий к оригиналу способ. Мы создадим собственную панель, которая будет выглядеть идентично системной. Разберем по шагам процесс создания:

  1. Создание контейнера: Добавим на форму над таблицей группу (тип — Группа без отображения) с горизонтальной группировкой элементов.
  2. Настройка оформления: Для этой группы установим цвет фона. Чтобы попасть точно «в цвет» платформы, следует использовать ЦветаСтиля.ЦветФонаСостоянияПросмотра или программно назначить WebЦвета.СветлоЖелтый.
  3. Добавление текста: Внутри группы разместим элемент Декорация — Надпись. Именно в это поле мы будем выводить текст примененных фильтров.
  4. Кнопка очистки: Для полноты картины можно добавить кнопку (гиперссылку) с картинкой «Очистить», которая будет сбрасывать отборы.

Посмотрим на пример программного управления видимостью такой панели:


&НаСервере
Процедура ОбновитьОтображениеСостоянияОтбора()
    
    ТекстОтбора = "";
    // Допустим, у нас есть структура или массив, где мы храним примененные фильтры
    Для Каждого ЭлементОтбора Из ТекущиеФильтрыТаблицы Цикл
        ТекстОтбора = ТекстОтбора + ЭлементОтбора.Представление + "; ";
    КонецЦикла;
    
    Если ЗначениеЗаполнено(ТекстОтбора) Тогда
        Элементы.ГруппаСостояниеПросмотра.Видимость = Истина;
        Элементы.ДекорацияТекстОтбора.Заголовок = "Отбор: " + ТекстОтбора;
    Иначе
        Элементы.ГруппаСостояниеПросмотра.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Проблема перехвата стандартного поиска

Выясним важный нюанс: если пользователь воспользуется стандартной командой Найти (через контекстное меню или горячие клавиши), платформа отфильтрует строки таблицы, но не вызовет никакого события на форме, которое мы могли бы перехватить. Это главная сложность при работе с обычными таблицами.

Чтобы наше «Состояние просмотра» работало корректно, рекомендуется применить следующий подход:

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

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


&НаКлиенте
Процедура ПолеПоискаПриИзменении(Элемент)
    
    // Устанавливаем отбор для элемента формы Таблица
    ПараметрыОтбора = Новый ФиксированнаяСтруктура("Наименование", ПолеПоиска);
    Элементы.МояТаблица.ОтборСтрок = ПараметрыОтбора;
    
    // Обновляем нашу самодельную панель состояния
    ОбновитьПанельСостояния(ПолеПоиска);
    
КонецПроцедуры

Использование ОтборСтрок удобно тем, что оно работает быстро и не требует перезаполнения всей коллекции данных. Однако помните, что это свойство доступно только для расширения таблицы в управляемых формах.

Способ 3. Переход к использованию Динамического списка

Если требования пользователя подразумевают полноценное Состояние просмотра со сложными условиями, группировками и возможностью удалять отдельные элементы фильтра «крестиком», возможно, стоит пересмотреть архитектуру решения.

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

  1. Создайте ДинамическийСписок с произвольным запросом.
  2. В качестве источника данных укажите временную таблицу или используйте объектную схему компоновки.
  3. Заполните данные во временную таблицу (через менеджер временных таблиц в запросе динамического списка).

В этом случае вы получите штатное свойство ОтображатьСостояниеПросмотра, которое будет работать «из коробки» без написания кода по управлению декорациями.

Резюме и практические советы

Выбор метода зависит от сложности задачи. Если вам нужно просто показать, что в таблице включен фильтр по одной колонке, достаточно Способа 1 (Декорация + Группа). Если же требуется интерактивность и соответствие всем стандартам платформы — выбирайте Способ 3.

Важные моменты, которые стоит запомнить:

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

← На главную