Как раскрасить активную строку в списке или таблице 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Причина некорректной раскраски всего списка

Проанализируем типовой код, который приводит к ошибке:


Функция ПроверитьВид() 
    Если ПустоеЗначение(ТекущийЭлемент()) = 1 Тогда
        // не выбран элемент
    Иначе
        Возврат "BRUSH[" + ПолучитьЦвет(204,255,204) + "]"; // Зеленый 
    КонецЕсли;
КонецФункции 

Выясним причину такого поведения. Функция раскраски, прописанная в свойствах вычисляемой колонки таблицы, вызывается платформой последовательно для каждой видимой на экране строки при её отрисовке. Метод контекста формы ТекущийЭлемент() возвращает ссылку на элемент, на котором в данный момент установлен курсор, а не тот объект, строка которого отрисовывается в текущий момент.

В результате условие ПустоеЗначение(ТекущийЭлемент()) = 0 возвращает истину для всех отображаемых строк, и управляющая конструкция BRUSH[...] перекрашивает фон всего списка. Чтобы управлять оформлением именно выделенной строки, необходимо использовать специализированные маркеры компоненты.

Специальные теги FormEx: BRUSH_S и FONT_S

Компонента FormEx разделяет параметры оформления для обычного состояния строки и для состояния выделения (Select):

  1. BRUSH[...] (или BRUSH_N[...]) — задает фоновый цвет обычной, невыделенной строки.
  2. FONT[...] (или FONT_N[...]) — определяет цвет шрифта обычной строки.
  3. BRUSH_S[...] — задает фоновый цвет активной (выделенной) строки.
  4. FONT_S[...] — определяет цвет шрифта активной строки.

Для задания цвета можно использовать как десятичное число (например, результат системной функции ПолучитьЦвет()), так и шестнадцатеричную нотацию в формате 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. Не выполняйте тяжелых операций: внутри функции раскраски категорически не рекомендуется использовать запросы, обходы регистров или методы поиска по реквизитам (НайтиПоРеквизиту). Это приведет к зависанию интерфейса.
  2. Кэшируйте настройки: значения цветов из констант и справочников настроек следует считывать один раз при открытии формы или глобально в структуру/список значений, после чего использовать готовые значения из оперативной памяти.
  3. Используйте «План раскраски»: для снижения нагрузки на интерпретатор 1С в компоненте FormEx предусмотрен механизм ПланРаскраски, который переносит часть логики сопоставления условий и цветов на уровень скомпилированного кода компоненты.
  4. Альтернатива через 1С++: при построении сложных интерфейсов с большим объемом данных альтернативным вариантом является использование объекта ТабличноеПоле из состава внешней компоненты 1С++, которое предоставляет расширенную событийную модель оформления без использования скрытых колонок с текстовыми маркерами.
← На главную