При работе с отчетами, обработками и динамическими таблицами в 1С:Предприятии часто возникает задача улучшения визуального восприятия данных. По умолчанию в элементе формы "Поле табличного документа" при клике выделяется только одна конкретная ячейка. Однако для пользователя гораздо удобнее, когда система наглядно подсвечивает всю строку целиком. Это позволяет быстро сориентироваться в горизонтальном ряду данных и исключает ошибки при чтении сложных таблиц.
В рамках данной статьи мы подробно разберем, как решить эту задачу. Мы изучим два принципиально разных подхода: современный декларативный метод, встроенный в платформу 1С, и классический программный метод, который применяется в более ранних версиях платформы или при необходимости реализации сложной кастомной логики.
Если вы работаете на современных версиях платформы 1С:Предприятие, вам не придется писать программный код для реализации подсветки. Разработчики платформы добавили штатный интерактивный механизм, который решает эту задачу "из коробки" и работает максимально быстро и плавно.
Для управления этим поведением у объекта ОбластьЯчеекТабличногоДокумента предусмотрено специальное свойство — РежимПодсветки. Оно определяет, как именно система реагирует на наведение указателя мыши или на фокус ввода в ячейке табличного документа.
Данное свойство принимает значения из системного перечисления РежимПодсветкиЯчейкиТабличногоДокумента:
Рассмотрим подробнее преимущества использования встроенного свойства РежимПодсветки:
Чтобы установить этот режим программно при формировании табличного документа, достаточно написать следующий код:
// Получаем область, для которой необходимо включить подсветку строк
ОбластьДанных = ТабличныйДокумент.Область("R1C1:R100C10");
ОбластьДанных.РежимПодсветки = РежимПодсветкиЯчейкиТабличногоДокумента.Строка;
Этот способ является наиболее предпочтительным для современных конфигураций.
Если ваша конфигурация работает на более старых версиях платформы, где свойство РежимПодсветки еще недоступно, задачу придется решать программным путем. Для этого мы будем использовать событие поля табличного документа ПриАктивизацииОбласти.
На форумах часто предлагают простые варианты решения, которые при тестировании в реальной базе приводят к серьезным ошибкам интерфейса или лагам. Давайте детально разберем по шагам, как построить надежный и быстрый алгоритм, лишенный этих недостатков.
При программной реализации подсветки необходимо решить три ключевые проблемы:
Область() табличного документа позволяет опускать параметры колонок, чтобы выбрать всю строку целиком.Рассмотрим правильную программную реализацию. Сначала объявим переменную на клиенте для хранения ранее выделенной области:
&НаКлиенте
Перем ПредыдущаяОбластьСтроки;
Теперь настроим обработку события активизации ячейки. Чтобы интерфейс не зависал при быстром пролистывании строк, мы не будем красить строку мгновенно. Вместо этого мы запустим однократный обработчик ожидания с минимальной задержкой (например, 0.1 секунды). Если пользователь быстро "пробежит" по строкам, система выполнит окрашивание только тогда, когда он окончательно остановится на конкретной строке.
&НаКлиенте
Процедура ТабличноеПолеПриАктивизацииОбласти(Элемент)
// Снимаем предыдущую команду окрашивания, если пользователь продолжает движение
ОтключитьОбработчикОжидания("ВыполнитьПодсветкуСтроки");
// Запускаем быстрый таймер для выполнения подсветки
ПодключитьОбработчикОжидания("ВыполнитьПодсветкуСтроки", 0.1, Истина);
КонецПроцедуры
Теперь реализуем саму процедуру подсветки. Обратите внимание на важный нюанс, который часто путают начинающие разработчики: обращаться к методу Область() нужно не у элемента формы (Элементы.МоеПолеТабДок), а непосредственно у самого объекта ТабличныйДокумент, который связан с этим элементом.
&НаКлиенте
Процедура ВыполнитьПодсветкуСтроки()
// Получаем доступ к табличному документу на форме
ТабДок = Объект.ИмяТабличногоДокумента;
// Получаем текущую активную ячейку через элемент формы
ТекущаяЯчейка = Элементы.ИмяЭлементаТабличногоДокумента.ТекущаяОбласть;
Если ТекущаяЯчейка = Неопределено Тогда
Возврат;
КонецЕсли;
// Шаг 1: Восстанавливаем цвет у предыдущей выделенной строки
Если ПредыдущаяОбластьСтроки <> Неопределено Тогда
// Присваиваем пустой цвет, чтобы вернуть исходное оформление ячеек
ПредыдущаяОбластьСтроки.ЦветФона = Новый Цвет();
КонецЕсли;
// Шаг 2: Определяем индекс текущей строки
НомерСтроки = ТекущаяЯчейка.Верх;
// Шаг 3: Получаем область всей строки целиком.
// Пропуск 2-го и 4-го параметров указывает системе выделить строку от начала до конца.
ОбластьТекущейСтроки = ТабДок.Область(НомерСтроки, , НомерСтроки, );
// Шаг 4: Устанавливаем цвет фона для новой активной строки.
// Рекомендуется использовать мягкие, пастельные тона, чтобы текст оставался читаемым.
ОбластьТекущейСтроки.ЦветФона = Новый Цвет(235, 245, 255); // Нежно-голубой цвет
// Шаг 5: Сохраняем текущую область в переменную для последующего сброса цвета
ПредыдущаяОбластьСтроки = ОбластьТекущейСтроки;
КонецПроцедуры
Мы проанализировали два подхода к решению задачи выделения активной строки. Если ваша платформа позволяет использовать современные свойства, всегда отдавайте приоритет Способу 1 с использованием РежимПодсветки. Это гарантирует максимальную производительность, корректную работу с объединенными ячейками и отсутствие необходимости писать сложный программный код поддержки.
Если же вы ограничены возможностями старых релизов платформ 1С, используйте Способ 2. Благодаря оптимизации через обработчик ожидания и правильному использованию метода Область(), вы сможете добиться плавной работы интерфейса и корректного отображения данных без зависаний.