Как реализовать выделение заголовка активной колонки в управляемых формах 1С?

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

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

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

Причина отсутствия штатного механизма

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

Базовая реализация через событие ПриАктивизацииЯчейки

Для того чтобы заголовок реагировал на действия пользователя, нам необходимо отслеживать перемещение курсора по таблице. Рассмотрим самый простой вариант реализации. Для этого нам понадобится событие таблицы ПриАктивизацииЯчейки.

Разберем пример кода, который можно разместить в модуле формы:


&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
    
    // Получаем имя текущей колонки, в которой находится курсор
    ТекущаяКолонкаИмя = Элемент.ТекущийЭлемент.Имя;
    
    // Нам нужно сбросить цвет у всех колонок и установить его для текущей
    // В данном примере переберем колонки таблицы "Список"
    Для Каждого Колонка Из Элементы.Список.ПодчиненныеЭлементы Цикл
        Если ТипЗнч(Колонка) = Тип("ПолеФормы") Тогда
            Колонка.ЦветФонаЗаголовка = WebЦвета.Белый; // Стандартный цвет
        КонецЕсли;
    КонецЦикла;
    
    // Устанавливаем акцентный цвет для активной колонки
    Элементы[ТекущаяКолонкаИмя].ЦветФонаЗаголовка = WebЦвета.Бежевый;
    
КонецПроцедуры

В этом коде мы используем свойство ЦветФонаЗаголовка. Важно помнить, что это свойство доступно для элементов типа ПолеФормы, входящих в состав таблицы.

Оптимизация: использование кэширования текущей колонки

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

Посмотрим на оптимизированный алгоритм:

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

&НаКлиенте
Перем ИмяПредыдущейКолонки;

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
    
    ТекущаяКолонкаИмя = Элемент.ТекущийЭлемент.Имя;
    
    // Если колонка не изменилась, ничего не делаем
    Если ТекущаяКолонкаИмя = ИмяПредыдущейКолонки Тогда
        Возврат;
    КонецЕсли;
    
    // Сбрасываем цвет предыдущей колонки, если она была заполнена
    Если ЗначениеЗаполнено(ИмяПредыдущейКолонки) Тогда
        Попытка
            Элементы[ИмяПредыдущейКолонки].ЦветФонаЗаголовка = ЦветаСтиля.ЦветФонаФормы;
        Исключение
            // На случай, если колонка была удалена или скрыта
        КонецПопытки;
    КонецЕсли;
    
    // Устанавливаем новый цвет
    Элементы[ТекущаяКолонкаИмя].ЦветФонаЗаголовка = WebЦвета.Золотистый;
    
    // Запоминаем текущую колонку для следующего шага
    ИмяПредыдущейКолонки = ТекущаяКолонкаИмя;
    
КонецПроцедуры

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

Расширенные возможности оформления

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

Выясним, какие свойства можно комбинировать:

Пример комплексного выделения:


// Создаем жирный шрифт для выделения
ЖирныйШрифт = Новый Шрифт(Элементы[ТекущаяКолонкаИмя].ШрифтЗаголовка, , , Истина);

Элементы[ТекущаяКолонкаИмя].ЦветФонаЗаголовка = WebЦвета.Синий;
Элементы[ТекущаяКолонкаИмя].ЦветТекстаЗаголовка = WebЦвета.Белый;
Элементы[ТекущаяКолонкаИмя].ШрифтЗаголовка = ЖирныйШрифт;

Особенности работы в различных условиях

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

1. Работа с группами колонок. Если ваши колонки объединены в группы, установка цвета для конкретной колонки окрасит только нижнюю часть заголовка (непосредственно над данными). Если вы хотите подсветить всю иерархию заголовков, вам придется программно найти родителя элемента через Элементы[ИмяКолонки].Родитель и применить оформление к нему. Однако будьте осторожны: изменение цвета группы повлияет на визуальное восприятие всех колонок внутри неё.

2. Системные цвета и темы оформления. Настоятельно рекомендуем не использовать фиксированные цвета типа WebЦвета.Бежевый. В современных версиях 1С пользователи могут переключаться между светлой и темной темами. Жестко заданный цвет может сделать текст нечитаемым. Используйте системные цвета, такие как ЦветаСтиля.ЦветФонаФормы или ЦветаСтиля.ТекстИнформационнойНадписи.

3. Веб-клиент. Обратите внимание, что в веб-клиенте отрисовка изменений свойств элементов формы происходит через отправку уведомлений браузеру. Это может работать с небольшой задержкой. Не перегружайте обработчик ПриАктивизацииЯчейки сложными вычислениями или запросами к серверу. Весь код должен быть строго &НаКлиенте и работать только с визуальными свойствами.

Резюме по реализации

Мы выяснили, что хотя платформа 1С v8.3 (УФ) не предоставляет стандартной настройки для подсветки заголовков, это легко реализуется программным путем. Основные шаги включают:

  1. Использование клиентского события ПриАктивизацииЯчейки.
  2. Программное управление свойством ЦветФонаЗаголовка.
  3. Оптимизацию через хранение состояния предыдущей колонки для обеспечения плавности интерфейса.

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

← На главную