Уже не первый раз появилась необходимость получить RGB составлящую любого цвета из палитры 1С (т.е. ЭлементСтиля, Абсолютный, WebЦвет, WindowsЦвет). Ни один полностью работающий механизм не нашел, кое-где кусочки, полуработающие и т.д.
Поэтому была поставлена задача создать максимально работающий вариант, который возвращал бы составлящую любого цвета.
Вид цвета 1С:
ЭлементСтиля — Под этим видом скрывается цвет определенный в метаданных, разворачиваем структуру и дальше обрабатываем.
Абсолютный — Здесь все просто, это и есть RGB
WebЦвет — Самый популярный и содержащий наибольшее кол-во оттенков цветов, его разобрать можно только по таблице соотношений, проблема было найти тот набор цветов которые использует 1С, но пару часов поиска дали результаты
WindowsЦвет — Его никак не раскрыть, потому пробуем через ФорматированныйДокумент. Дополнительно используется процедура конвертации HEX в DEC
Все обворачиваем в попытку, на всякий случай.
&НаСервереБезКонтекста
// Функция - Получить RGBЦвет
//
// Параметры:
// Цвет - -
// Вернуть_HEX - -
//
// Возвращаемое значение:
// -
//
Функция ПолучитьRGBЦвет(Знач Цвет, Вернуть_HEX = Ложь) Экспорт
МакетСоответствиеЦветовWebИRGB = ПолучитьОбщийМакет("СоответствиеЦветовWebИRGB");
ЦветРезультат = "";
// Переменная Цвет не определена
Если Цвет = Неопределено Тогда
Возврат "";
КонецЕсли;
// Приводим цвет стиля к простому RGB, Абсолютному, Windows-цвету
Если Цвет.Вид = ВидЦвета.ЭлементСтиля Тогда
ОбъектМетаданныхСтиля = Метаданные.ЭлементыСтиля.Найти(Сред(Строка(Цвет), 8));
Если ОбъектМетаданныхСтиля <> Неопределено Тогда
Цвет = ОбъектМетаданныхСтиля.Значение;
КонецЕсли;
КонецЕсли;
//Получаем RGB цвет из макета
Если Цвет.Вид = ВидЦвета.Абсолютный Тогда
ЦветРезультат = Строка(Цвет.Красный) + "," + Строка(Цвет.Зеленый) + "," + Строка(Цвет.Синий);
ИначеЕсли Цвет.Вид = ВидЦвета.WebЦвет Тогда
ЦветИмяПриведеное = Строка(Цвет);
ЦветИмяПриведеное = Сред(ЦветИмяПриведеное, СтрНайти(ЦветИмяПриведеное, "(") + 1);
ЦветИмяПриведеное = Сред(ЦветИмяПриведеное, 1, СтрНайти(ЦветИмяПриведеное, ")") - 1);
НайденнаяОбластьСоответствияИмениЦвета = МакетСоответствиеЦветовWebИRGB.НайтиТекст(ЦветИмяПриведеное, , МакетСоответствиеЦветовWebИRGB.Область("ДанныеСоответствияЦветов|ИмяЦвета"), , Истина, , Истина);
Если НайденнаяОбластьСоответствияИмениЦвета <> Неопределено Тогда
НайденнаяОбластьСоответствияRGB = МакетСоответствиеЦветовWebИRGB.Область(НайденнаяОбластьСоответствияИмениЦвета.Верх, МакетСоответствиеЦветовWebИRGB.Область("RGB").Лево);
Если НайденнаяОбластьСоответствияRGB <> Неопределено Тогда
ЦветРезультат = НайденнаяОбластьСоответствияRGB.Текст;
КонецЕсли;
КонецЕсли;
ИначеЕсли Цвет.Вид = ВидЦвета.WindowsЦвет ИЛИ Цвет.Вид = ВидЦвета.ЭлементСтиля Тогда
// Невозможно определить цвет, но попытаемся извращениями )
ТекстХТМЛДокумента = "";
Шаблон = "0123456789ABCDEF";
ФорматированныйДокумент = Новый ФорматированныйДокумент;
ФорматированныйДокумент.Добавить("ОпределениеЦвета", Тип("ТекстФорматированногоДокумента"));
ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона = Цвет;
ФорматированныйДокумент.ПолучитьHTML(ТекстХТМЛДокумента, Новый Структура);
НомерСимволаЦвета = Найти(ТекстХТМЛДокумента, "background-color: #");
ЦветРезультатHex = Сред(ТекстХТМЛДокумента, НомерСимволаЦвета+19, 6);
ЦветРезультат = "" + КонвертироватьHexВDec(Сред(ЦветРезультатHex, 1, 2)) + "," + КонвертироватьHexВDec(Сред(ЦветРезультатHex, 3, 2)) + "," + КонвертироватьHexВDec(Сред(ЦветРезультатHex, 5, 2));
ИначеЕсли Цвет.Вид = ВидЦвета.АвтоЦвет Тогда
// Пустой цвет (определяется элементом владельцем, не содержит сам цвет)
КонецЕсли;
Возврат ЦветРезультат;
КонецФункции
&НаСервереБезКонтекста
// Функция - Конвертировать hex в dec
//
Функция КонвертироватьHexВDec(Знач ЧислоСтрокой) Экспорт
Результат = 0;
Шаблон = "0123456789ABCDEF";
ЧислоСтрокой = ВРег(Строка(ЧислоСтрокой));
Для ТекущийСимвол = 1 По СтрДлина(ЧислоСтрокой) Цикл
ПозицияВШаблоне = Найти(Шаблон, Сред(ЧислоСтрокой, ТекущийСимвол, 1))-1;
Результат = Результат * СтрДлина(Шаблон) + ПозицияВШаблоне;
КонецЦикла;
Возврат Результат;
КонецФункции
Ниже прилагаю макет данного механизма.
P.S: Делал это пару лет назад, а сейчас увидел у себя в черновиках недописанную статью, решил опубликовать ).
Странно, при попытке выложить бесплатно пишет запрещено и добавляет сам стартмани ((((
(1) Вот так поневоле люди и становятся миллиардерами:)
Текст функции КонвертироватьHexВDec ??
(3)
Это сделал глобальный модуль расширения базовых функций, и туда такие вот функции складирую …
Вечером гляну, выложу.
(3) Выложил
Для ЭлементСтиля и WebЦвет можно туда-обратно прогонять через ФорматированныйДокумент:
Не совсем. Насколько я помню ФорматированныйДокумент не доступен на сервере. Это единственный быстрый и универсальный вариант
А еще есть замечательная утилита Pixie, не требующая установки)
Для цвета типа ЭлементСтиля фокус через форматированный документ не работает (платформа 8.3.12 без совместимости). Приходится получать абсолютный цвет через табличный документ (запись, а потом чтение).