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

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

При разработке и доработке интерфейсов в толстом клиенте (обычные формы) разработчики часто сталкиваются с дилеммой при настройке свойства табличного поля РежимВыделенияСтроки. Если выбрать значение Строка, пользователю удобно считывать данные по широким таблицам, но становится трудно определить, какая конкретно колонка активна в данный момент, и пропадает возможность быстрого копирования текста отдельной ячейки через Ctrl+C. Если же установить режим Ячейка, теряется наглядность всей строки целиком.

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

Особенности платформы и почему не работает простое условное оформление

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

  1. Рамка фокуса не настраивается из кода: Системная рамка вокруг текущей строки рисуется средствами операционной системы. У объектов ОформлениеСтроки и ОформлениеЯчейки отсутствуют свойства толщины или цвета границ.
  2. Событие ПриВыводеСтроки вызывается только при отрисовке: При перемещении курсора по списку с помощью клавиатуры или мыши событие ПриВыводеСтроки не вызывается повторно для старой и новой строки, если список не прокручивается.
  3. Событие ПриАктивизацииСтроки не оформляет данные: Данный обработчик фиксирует сам факт перехода на строку, но не имеет доступа к коллекции ОформленияСтрок.

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

Решение: Динамическая подсветка через ПриПолученииДанных и ОбновитьСтроки

Рассмотрим по шагам реализацию механизма. Для хранения ссылки или идентификатора активной строки объявим переменную на уровне модуля формы. При смене позиции курсора будем принудительно перерисовывать только две строки — предыдущую активную и новую активную, чтобы форма не зависала и не мерцала.

  1. Объявим переменную модуля формы для хранения текущей активной строки: Перем мТекущаяСтрока;
  2. В обработчике события ПриАктивизацииСтроки сформируем массив из предыдущей и новой строки и передадим его в метод ОбновитьСтроки():
    
    Процедура СписокПриАктивизацииСтроки(Элемент)
        
        // Проверяем, изменилась ли активная строка
        Если Элемент.ТекущаяСтрока = мТекущаяСтрока Тогда
            Возврат;
        КонецЕсли;
        
        // Формируем массив для точечной перерисовки только изменившихся строк
        МассивСтрок = Новый Массив;
        
        Если ЗначениеЗаполнено(мТекущаяСтрока) Тогда
            МассивСтрок.Добавить(мТекущаяСтрока);
        КонецЕсли;
        
        Если ЗначениеЗаполнено(Элемент.ТекущаяСтрока) Тогда
            МассивСтрок.Добавить(Элемент.ТекущаяСтрока);
        КонецЕсли;
        
        // Запоминаем новую активную строку
        мТекущаяСтрока = Элемент.ТекущаяСтрока;
        
        // Заставляем табличное поле перерисовать только нужные строки
        ЭлементыФормы.Список.ОбновитьСтроки(МассивСтрок);
        
    КонецПроцедуры
    
  3. В событии ПриПолученииДанных опишем логику изменения цвета фона:
    
    Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
        
        Для Каждого Оформление Из ОформленияСтрок Цикл
            
            Если Оформление.ДанныеСтроки.Ссылка = мТекущаяСтрока Тогда
                // Выделяем текущую строку мягким пастельным цветом
                Оформление.ЦветФона = WebЦвета.СветлоНебесноГолубой;
            Иначе
                // Сбрасываем цвет в значение по умолчанию
                Оформление.ЦветФона = Новый Цвет;
            КонецЕсли;
            
        КонецЦикла;
        
    КонецПроцедуры
    

Важное замечание: Для сброса цвета фона неактивных строк необходимо указывать Новый Цвет, а не фиксированный WebЦвета.Белый. Использование неопределенного (пустого) цвета сохраняет стандартное чередование строк таблицы (ЧередованиеЦветовСтрок) и другие цветовые выделения (например, серый цвет для помеченных на удаление элементов).

Вариант оформления: Выделение полужирным шрифтом

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


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

Альтернативный подход: Режим «Строка» с подсветкой активной колонки

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

  1. Установим в свойствах табличного поля РежимВыделенияСтроки = РежимВыделенияСтрокиТабличногоПоля.Строка.
  2. При смене ячейки будем динамически окрашивать шапку активной колонки с помощью события ПриАктивизацииЯчейки:
    
    Перем мТекущаяКолонка;
    
    Процедура СписокПриАктивизацииЯчейки(Элемент)
        
        // Сбрасываем цвет предыдущей активной колонки
        Если мТекущаяКолонка <> Неопределено Тогда
            мТекущаяКолонка.ЦветФонаШапки = Новый Цвет;
        КонецЕсли;
        
        // Подсвечиваем заголовок новой активной колонки
        мТекущаяКолонка = Элемент.ТекущаяКолонка;
        Если мТекущаяКолонка <> Неопределено Тогда
            мТекущаяКолонка.ЦветФонаШапки = WebЦвета.Желтый;
        КонецЕсли;
        
    КонецПроцедуры
    

Такой комбинированный подход позволяет сохранить видимость всей строки без потери ориентации по колонкам таблицы.

← На главную