Как изменить цвет ячейки или строки в табличной части 1С?

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

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

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


Процедура ЗаменаЦвета() 
    Для каждого стр Из Объект.МесячныйСписок Цикл
        Если Месяц(стр.Дата) < 5 Тогда
            Цвет = Новый Цвет(255, 0, 0);
            стр.Дата = Цвет;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Выясним причину ошибки

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

Любое визуальное оформление (цвет фона, цвет текста, шрифт, доступность) задается исключительно на уровне визуальных элементов формы, а не в самих данных табличной части.

Решение 1. Настройка условного оформления в управляемых формах

Если в коде используется контекст Объект, мы работаем с управляемой формой. В управляемых формах за визуальное оформление динамических списков, таблиц значений и табличных частей отвечает механизм Условного оформления.

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

  1. Использование вспомогательного реквизита: добавим в табличную часть скрытый реквизит МесяцДоМая с типом Булево (или НомерМесяца с типом Число). При заполнении данных или изменении даты вычисляем значение этого флага. В условном оформлении проверяем именно его.
  2. Сравнение с фиксированной границей даты: если данные анализируются в рамках конкретного календарного года, условие задается прямым сравнением с пороговой датой (вид сравнения Меньше, значение 01.05.2024 00:00:00).

Разберем по шагам программную настройку условного оформления на сервере (например, в процедуре ПриСозданииНаСервере формы):

  1. Создаем новый элемент условного оформления в коллекции УсловноеОформление.
  2. Задаем оформление (цвет текста или цвет фона).
  3. Указываем оформляемые поля формы, к которым будет применен стиль.
  4. Формируем условие отбора.

Посмотрим на пример программной реализации с использованием вспомогательного реквизита МесяцДоМая:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Создаем элемент условного оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Настраиваем цвет текста (или "ЦветФона")
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(255, 0, 0));
    
    // Указываем колонку таблицы, которую необходимо раскрасить
    ОформляемоеПоле = ЭлементОформления.ОформляемыеПоля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("МесячныйСписокДата");
    
    // Задаем условие отбора
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.МесячныйСписок.МесяцДоМая");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Истина;
    ЭлементОтбора.Использование = Истина;

КонецПроцедуры

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

Решение 2. Оформление строк в обычных формах (толстый клиент)

Если разработка ведется в конфигурации на обычных формах, раскрашивание ячеек выполняется с помощью событий табличного поля. Существует два основных обработчика:

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

Посмотрим на пример оформления через событие ПриВыводеСтроки элемента управления таблицы:


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

Таким образом, для раскрашивания данных всегда используйте специализированные механизмы платформы 1С: Условное оформление для управляемого интерфейса или события ПриВыводеСтроки / ПриПолученииДанных для обычных форм.

← На главную