В платформе 1С:Предприятие 7.7 штатные средства визуального оформления списков и табличных частей ограничены. Для гибкого управления цветом строк и ячеек традиционно применяется внешняя компонента FormEx. Однако разработчики часто сталкиваются с ситуацией, когда при попытке подсветить текущую позицию курсора окрашивается весь список целиком. Разберем по шагам, почему возникает эта ошибка и как правильно настроить выделение активной строки.
Проанализируем типовой код, который приводит к ошибке:
Функция ПроверитьВид()
Если ПустоеЗначение(ТекущийЭлемент()) = 1 Тогда
// не выбран элемент
Иначе
Возврат "BRUSH[" + ПолучитьЦвет(204,255,204) + "]"; // Зеленый
КонецЕсли;
КонецФункции
Выясним причину такого поведения. Функция раскраски, прописанная в свойствах вычисляемой колонки таблицы, вызывается платформой последовательно для каждой видимой на экране строки при её отрисовке. Метод контекста формы ТекущийЭлемент() возвращает ссылку на элемент, на котором в данный момент установлен курсор, а не тот объект, строка которого отрисовывается в текущий момент.
В результате условие ПустоеЗначение(ТекущийЭлемент()) = 0 возвращает истину для всех отображаемых строк, и управляющая конструкция BRUSH[...] перекрашивает фон всего списка. Чтобы управлять оформлением именно выделенной строки, необходимо использовать специализированные маркеры компоненты.
Компонента FormEx разделяет параметры оформления для обычного состояния строки и для состояния выделения (Select):
Для задания цвета можно использовать как десятичное число (например, результат системной функции ПолучитьЦвет()), так и шестнадцатеричную нотацию в формате Windows COLORREF (0xBBGGRR, где порядок байтов: Blue, Green, Red):
// Пример возврата цвета фона для активной строки через шестнадцатеричный код:
Возврат "BRUSH_S[0xCCFFCC]";
Рассмотрим, как правильно организовать функцию раскраски в форме списка справочника, журнала документов или таблицы значений. Данный механизм универсален и одинаково работает во всех табличных элементах управления.
Шаг 1. Добавим на форму списка текстовую колонку нулевой ширины (или разместим вызов функции в формуле существующей колонки).
Шаг 2. Напишем функцию определения цвета, которая возвращает маркер BRUSH_S:
Функция глОпределитьЦветСтроки()
// Задаем цвет подсветки для активной строки
ЦветВыделения = "BRUSH_S[0xCCFFCC]"; // Светло-зеленый
// При необходимости можно добавить цвет шрифта выделенной строки
ЦветШрифтаВыделения = "FONT_S[0x000080]"; // Темно-синий
Возврат ЦветВыделения + ЦветШрифтаВыделения;
КонецФункции
Разберем практический пример из реальной конфигурации, где для каждой строки задается базовый цвет в зависимости от состояния объекта (пометка на удаление, дата запрета), а активная строка подсвечивается системным цветом:
// Функция для вставки в форму списка справочника или журнала
Функция ОпределитьЦветСтроки()
Если ПустоеЗначение(ТекущийДокумент) = 1 Тогда
Возврат "";
КонецЕсли;
Возврат глОпределитьЦветСтрокиОбъекта(ТекущийДокумент);
КонецФункции
// Глобальная функция расчета параметров отображения
Функция глОпределитьЦветСтрокиОбъекта(Объект)
// 1. Инициализируем подсветку активной строки из константы
парЦвета = "BRUSH_S[" + Константа.ЦветПодсветкиТекущейСтроки.ДесятичноеЗнач + "]";
// 2. Добавляем условное оформление в зависимости от типа и состояния объекта
Если ТипЗначенияСтр(Объект) = "Документ" Тогда
Если Объект.ПометкаУдаления() = 1 Тогда
// Цвет фона для помеченных на удаление (обычное состояние)
БазовыйЦветУд = СокрЛП(Константа.ЦветПомеченныхНаУдаление.ДесятичноеЗнач);
парЦвета = парЦвета + "BRUSH[" + ?(ПустоеЗначение(БазовыйЦветУд) = 0, БазовыйЦветУд, "16777215") + "]";
КонецЕсли;
КонецЕсли;
Возврат парЦвета;
КонецФункции
Обратим внимание на критически важный аспект быстродействия 1С 7.7. Функция раскраски вызывается многократно при любых интерактивных событиях: прокрутке колесом мыши, перерисовке окна или перемещении курсора.
НайтиПоРеквизиту). Это приведет к зависанию интерфейса.ПланРаскраски, который переносит часть логики сопоставления условий и цветов на уровень скомпилированного кода компоненты.ТабличноеПоле из состава внешней компоненты 1С++, которое предоставляет расширенную событийную модель оформления без использования скрытых колонок с текстовыми маркерами.