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