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

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

При формировании печатных форм или отчетов в 1С часто возникает задача динамического форматирования ячеек, например, окрашивания текста в определенный цвет в зависимости от условий. Стандартный объект WebЦвета предоставляет доступ к палитре стандартных веб-цветов. Однако, если имя цвета хранится в переменной, попытка установить его через точку (WebЦвета.ИмяЦвета) приведет к ошибке. Разберем, как правильно обращаться к цветам по их строковому имени.

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

Решение 1: Использование квадратных скобок для доступа к Web-цвету по имени

Самый простой и правильный способ получить доступ к цвету по его имени, хранящемуся в переменной — это использовать синтаксис квадратных скобок. Объект WebЦвета по своей сути является коллекцией, где ключами выступают строковые имена цветов. Доступ к элементам такой коллекции осуществляется именно через квадратные скобки.

Почему синтаксис с точкой не работает? Конструкция WebЦвета.SteelBlue работает, потому что SteelBlue — это известное, фиксированное свойство объекта. Когда мы пишем WebЦвета.МояПеременная, система ищет свойство с именем "МояПеременная", а не использует значение, которое в этой переменной хранится. Синтаксис WebЦвета[МояПеременная], напротив, сначала получает значение из переменной (например, строку "SteelBlue"), а затем использует это значение как ключ для поиска в коллекции цветов.

Рассмотрим по шагам на примере (похожим образом можно прокачать динамический список в расширении):

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

Посмотрим на пример кода (такое программное изменение форм и макетов часто требуется разработчикам):


Процедура УстановитьЦветТекста()

    // 1. Создаем и подготавливаем табличный документ
    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("МойМакет"); // Предполагается, что в модуле есть макет
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

    // 2. Определяем имя цвета в переменной
    // Это значение может быть получено динамически, например, из настроек или базы данных
    ИмяНужногоЦвета = "SteelBlue"; 

    // 3. Устанавливаем цвет текста для области
    // Используем квадратные скобки для доступа к цвету по значению переменной
    Попытка
        ОбластьЗаголовок.ЦветТекста = WebЦвета[ИмяНужногоЦвета];
    Исключение
        // Обработка ситуации, если цвета с таким именем не существует
        Сообщить("Не найден цвет: " + ИмяНужногоЦвета);
        // Можно установить цвет по умолчанию
        ОбластьЗаголовок.ЦветТекста = WebЦвета.Black;
    КонецПопытки;
    
    // Заполняем параметр и выводим область
    ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Пример форматирования";
    ТабДок.Вывести(ОбластьЗаголовок);
    
    // Показываем результат
    ТабДок.Показать("Пример установки цвета");

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

Этот метод является основным и наиболее предпочтительным для решения данной задачи. Он лаконичен и точно отражает суть операции — получение элемента коллекции по ключу.

Решение 2: Использование метода ПолучитьЦвет()

В качестве альтернативы у объекта WebЦвета есть специальный метод ПолучитьЦвет(), который делает то же самое — возвращает цвет по его строковому имени. Этот способ может быть более наглядным и читаемым для других разработчиков, так как явно указывает на выполняемое действие.

Принцип работы абсолютно такой же, как и в первом решении, отличается только синтаксис вызова.

Посмотрим на пример кода с использованием этого метода:


Процедура УстановитьЦветТекстаЧерезМетод()

    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("МойМакет"); 
    ОбластьДанные = Макет.ПолучитьОбласть("Данные");

    ИмяЦветаДляВыделения = "Firebrick"; // Например, кирпично-красный цвет

    // Используем метод ПолучитьЦвет() для установки цвета
    ЦветВыделения = WebЦвета.ПолучитьЦвет(ИмяЦветаДляВыделения);

    // Проверяем, что цвет был найден
    Если ЦветВыделения <> Неопределено Тогда
        ОбластьДанные.ЦветТекста = ЦветВыделения;
    Иначе
        Сообщить("Цвет '" + ИмяЦветаДляВыделения + "' не найден в палитре WebЦветов.");
        ОбластьДанные.ЦветТекста = WebЦвета.Black;
    КонецЕсли;

    ОбластьДанные.Параметры.ЗначениеПоказателя = "Важное значение!";
    ТабДок.Вывести(ОбластьДанные);
    ТабДок.Показать("Пример с методом ПолучитьЦвет");

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

Метод ПолучитьЦвет() возвращает Неопределено, если цвет с указанным именем не найден, что позволяет легко организовать проверку и обработку такой ситуации без использования блока Попытка-Исключение.

Дополнительные способы работы с цветом в 1С

Помимо WebЦвета, в платформе существуют и другие способы определения и использования цветов.

Создание цвета по RGB:

Если вам нужен уникальный цвет, которого нет в стандартной палитре, вы можете создать его, указав значения красного, зеленого и синего каналов (от 0 до 255).


// Создание собственного фиолетового цвета
МойЦвет = Новый Цвет(128, 0, 128); 
Область.ЦветТекста = МойЦвет;

Использование системных цветов:

Для сохранения единого стиля интерфейса с настройками операционной системы или платформы 1С можно использовать объект СистемныеЦвета. Эти цвета зависят от текущей темы оформления.


// Используем системный цвет для текста неактивного элемента
Область.ЦветТекста = СистемныеЦвета.ЦветНедоступногоТекста; 

// Используем стандартный цвет для гиперссылки
Область.ЦветТекста = СистемныеЦвета.ЦветГиперссылки;

В заключение, для задачи установки цвета по его имени из переменной лучше всего подходят два рассмотренных метода: синтаксис с квадратными скобками (WebЦвета[ИмяЦвета]) как самый короткий и метод ПолучитьЦвет() как более "говорящий" и удобный для проверки на существование цвета.

← На главную