Как изменить цвет строки табличной части в обычных формах (ОФ)?

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

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

Почему прямой цикл «не красит» строки?

Рассмотрим типичную ошибку. Программист пишет код, в котором перебирает строки табличной части и пытается изменить свойство ЦветФона через объект ОформлениеСтроки. Однако после завершения работы алгоритма визуально ничего не меняется. Проанализируем причину: объект оформления, полученный методом ЭлементыФормы.ИмяТаблицы.ОформлениеСтроки(Строка), является самостоятельным объектом. Он не связан жестко с состоянием отображения табличного поля в реальном времени. Система отрисовывает строки динамически, и как только ваш код заканчивает работу, платформа перерисовывает таблицу стандартными цветами, игнорируя ваши локальные изменения.

Важное правило: Изменение оформления строки в обычных формах должно происходить исключительно внутри специализированных обработчиков событий табличного поля: ПриВыводеСтроки или ПриПолученииДанных.

Подготовка данных: где хранить состояние раскраски

Поскольку оформление срабатывает динамически (например, при прокрутке списка), нам нужно где-то «запомнить», что конкретная строка должна быть красной. Рассмотрим два основных способа хранения этой информации:

  1. Скрытая колонка в табличной части: Это самый простой и надежный метод. Добавим в состав табличной части реквизит НужноПодсветить с типом Булево или Число. Эту колонку не нужно выводить на форму (снимаем галочку «Видимость»).
  2. Соответствие в модуле формы: Если структуру метаданных менять нельзя, мы можем создать переменную на уровне модуля формы мСтрокиДляОформления с типом Соответствие. Ключом будет выступать ссылка на строку (или индекс), а значением — желаемый цвет.

Реализация через событие ПриВыводеСтроки

Событие ПриВыводеСтроки вызывается для каждой строки в отдельности в тот момент, когда она должна появиться на экране. Проанализируем, как реализовать раскраску, если мы используем скрытую колонку НужноПодсветить.

Рассмотрим пример кода в обработчике события:


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

Выясним причину, почему это удобно: нам не нужно делать запросы внутри этого события, так как данные строки уже доступны в параметре ДанныеСтроки. Однако помните, что это событие вызывается часто, поэтому внутри него нельзя писать тяжелый код.

Оптимальный метод: ПриПолученииДанных

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

Разберем пример реализации:


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

Как запустить перекраску по нажатию кнопки?

Теперь перейдем к самому главному вопросу: как сделать так, чтобы строки меняли цвет именно тогда, когда пользователь нажимает на кнопку? Мы уже выяснили, что красить «внутри кнопки» бесполезно. Правильный алгоритм действий выглядит так:

  1. В обработчике нажатия кнопки мы проходим циклом по данным табличной части.
  2. Устанавливаем признак (флаг) в нашей скрытой колонке.
  3. Вызываем метод Обновить() для табличного поля, что заставит систему перерисовать интерфейс и вызвать события оформления.

Посмотрим на пример кода для кнопки:


Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    // 1. Устанавливаем признаки раскраски в данных
    Для Каждого СтрокаТовара Из Товары Цикл
        Если СтрокаТовара.Количество > 100 Тогда
            СтрокаТовара.НужноПодсветить = Истина;
        Иначе
            СтрокаТовара.НужноПодсветить Ложь;
        КонецЕсли;
    КонецЦикла;
    
    // 2. Принудительно обновляем отображение таблицы
    // Это инициирует вызов ПриВыводеСтроки или ПриПолученииДанных
    ЭлементыФормы.Товары.Обновить();
    
КонецПроцедуры

Тонкости и типичные ошибки

Проанализируем несколько важных моментов, которые помогут сделать интерфейс более отзывчивым и качественным:

1. Использование ДанныеСтроки против ТекущиеДанные: Никогда не используйте ЭлементыФормы.Товары.ТекущиеДанные внутри процедур оформления. Это свойство всегда возвращает только ту строку, на которой стоит курсор. Для правильной раскраски каждой строки используйте только те данные, которые передаются в параметрах события (ОформлениеСтроки.ДанныеСтроки).

2. Раскраска отдельных ячеек: Если вам нужно выделить не всю строку, а только конкретный показатель (например, колонку "Цена"), используйте коллекцию ячеек:


// Пример для ПриВыводеСтроки
ОформлениеСтроки.Ячейки.Цена.ЦветФона = WebЦвета.Золотистый;
ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WebЦвета.Красный;

3. Производительность: Старайтесь не выполнять сложные вычисления внутри событий оформления. Если условие раскраски требует запроса к базе данных, выполните этот расчет заранее (при нажатии кнопки или при открытии формы) и сохраните результат в служебную колонку или в Соответствие.

4. Обновление строк: Существует метод ОбновитьСтроки(), который работает быстрее, чем полный Обновить(), так как перерисовывает только видимую часть. Используйте его для динамических изменений в процессе работы пользователя.

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

← На главную