При формировании печатных форм или отчетов в 1С часто возникает задача динамического форматирования ячеек, например, окрашивания текста в определенный цвет в зависимости от условий. Стандартный объект WebЦвета предоставляет доступ к палитре стандартных веб-цветов. Однако, если имя цвета хранится в переменной, попытка установить его через точку (WebЦвета.ИмяЦвета) приведет к ошибке. Разберем, как правильно обращаться к цветам по их строковому имени.
Проанализируем ситуацию: у нас есть переменная, содержащая имя цвета (например, "SteelBlue"), и нам нужно присвоить этот цвет свойству ЦветТекста области табличного документа, используя механизм, напоминающий форматированный документ. Прямое обращение не сработает, так как платформа попытается найти свойство с именем, совпадающим с именем переменной, а не ее значением.
Самый простой и правильный способ получить доступ к цвету по его имени, хранящемуся в переменной — это использовать синтаксис квадратных скобок. Объект WebЦвета по своей сути является коллекцией, где ключами выступают строковые имена цветов. Доступ к элементам такой коллекции осуществляется именно через квадратные скобки.
Почему синтаксис с точкой не работает? Конструкция WebЦвета.SteelBlue работает, потому что SteelBlue — это известное, фиксированное свойство объекта. Когда мы пишем WebЦвета.МояПеременная, система ищет свойство с именем "МояПеременная", а не использует значение, которое в этой переменной хранится. Синтаксис WebЦвета[МояПеременная], напротив, сначала получает значение из переменной (например, строку "SteelBlue"), а затем использует это значение как ключ для поиска в коллекции цветов.
Рассмотрим по шагам на примере (похожим образом можно прокачать динамический список в расширении):
ЦветТекста, используя квадратные скобки.Посмотрим на пример кода (такое программное изменение форм и макетов часто требуется разработчикам):
Процедура УстановитьЦветТекста()
// 1. Создаем и подготавливаем табличный документ
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МойМакет"); // Предполагается, что в модуле есть макет
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// 2. Определяем имя цвета в переменной
// Это значение может быть получено динамически, например, из настроек или базы данных
ИмяНужногоЦвета = "SteelBlue";
// 3. Устанавливаем цвет текста для области
// Используем квадратные скобки для доступа к цвету по значению переменной
Попытка
ОбластьЗаголовок.ЦветТекста = WebЦвета[ИмяНужногоЦвета];
Исключение
// Обработка ситуации, если цвета с таким именем не существует
Сообщить("Не найден цвет: " + ИмяНужногоЦвета);
// Можно установить цвет по умолчанию
ОбластьЗаголовок.ЦветТекста = WebЦвета.Black;
КонецПопытки;
// Заполняем параметр и выводим область
ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Пример форматирования";
ТабДок.Вывести(ОбластьЗаголовок);
// Показываем результат
ТабДок.Показать("Пример установки цвета");
КонецПроцедуры
Этот метод является основным и наиболее предпочтительным для решения данной задачи. Он лаконичен и точно отражает суть операции — получение элемента коллекции по ключу.
В качестве альтернативы у объекта WebЦвета есть специальный метод ПолучитьЦвет(), который делает то же самое — возвращает цвет по его строковому имени. Этот способ может быть более наглядным и читаемым для других разработчиков, так как явно указывает на выполняемое действие.
Принцип работы абсолютно такой же, как и в первом решении, отличается только синтаксис вызова.
Посмотрим на пример кода с использованием этого метода:
Процедура УстановитьЦветТекстаЧерезМетод()
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МойМакет");
ОбластьДанные = Макет.ПолучитьОбласть("Данные");
ИмяЦветаДляВыделения = "Firebrick"; // Например, кирпично-красный цвет
// Используем метод ПолучитьЦвет() для установки цвета
ЦветВыделения = WebЦвета.ПолучитьЦвет(ИмяЦветаДляВыделения);
// Проверяем, что цвет был найден
Если ЦветВыделения <> Неопределено Тогда
ОбластьДанные.ЦветТекста = ЦветВыделения;
Иначе
Сообщить("Цвет '" + ИмяЦветаДляВыделения + "' не найден в палитре WebЦветов.");
ОбластьДанные.ЦветТекста = WebЦвета.Black;
КонецЕсли;
ОбластьДанные.Параметры.ЗначениеПоказателя = "Важное значение!";
ТабДок.Вывести(ОбластьДанные);
ТабДок.Показать("Пример с методом ПолучитьЦвет");
КонецПроцедуры
Метод ПолучитьЦвет() возвращает Неопределено, если цвет с указанным именем не найден, что позволяет легко организовать проверку и обработку такой ситуации без использования блока Попытка-Исключение.
Помимо WebЦвета, в платформе существуют и другие способы определения и использования цветов.
Создание цвета по RGB:
Если вам нужен уникальный цвет, которого нет в стандартной палитре, вы можете создать его, указав значения красного, зеленого и синего каналов (от 0 до 255).
// Создание собственного фиолетового цвета
МойЦвет = Новый Цвет(128, 0, 128);
Область.ЦветТекста = МойЦвет;
Использование системных цветов:
Для сохранения единого стиля интерфейса с настройками операционной системы или платформы 1С можно использовать объект СистемныеЦвета. Эти цвета зависят от текущей темы оформления.
// Используем системный цвет для текста неактивного элемента
Область.ЦветТекста = СистемныеЦвета.ЦветНедоступногоТекста;
// Используем стандартный цвет для гиперссылки
Область.ЦветТекста = СистемныеЦвета.ЦветГиперссылки;
В заключение, для задачи установки цвета по его имени из переменной лучше всего подходят два рассмотренных метода: синтаксис с квадратными скобками (WebЦвета[ИмяЦвета]) как самый короткий и метод ПолучитьЦвет() как более "говорящий" и удобный для проверки на существование цвета.