Получение RGB (HEX) цвета

Программирование - Работа с интерфейсом

Получение RGB (HEX) цвета из любого вида цветов 1С.

Уже не первый раз появилась необходимость получить 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: Делал это пару лет назад, а сейчас увидел у себя в черновиках недописанную статью, решил опубликовать ).

Скачать файлы

Наименование Файл Версия Размер
Макет получение RGB (HEX) цвета
.mxl 23,13Kb
14.09.17
2
.mxl 23,13Kb 2 Скачать

См. также

Комментарии
1. Александр Днестрян (AlexxSys) 184 14.09.17 23:43 Сейчас в теме
Странно, при попытке выложить бесплатно пишет запрещено и добавляет сам стартмани ((((
2. Yan Tsys (YanTsys) 9 15.09.17 09:05 Сейчас в теме
(1) Вот так поневоле люди и становятся миллиардерами:)
3. Денис Харченко (nomadon) 133 15.09.17 11:24 Сейчас в теме
Текст функции КонвертироватьHexВDec ??
4. Александр Днестрян (AlexxSys) 184 15.09.17 13:32 Сейчас в теме
(3)
КонвертироватьHexВDec

Это сделал глобальный модуль расширения базовых функций, и туда такие вот функции складирую ...
Вечером гляну, выложу.
5. Александр Днестрян (AlexxSys) 184 15.09.17 22:32 Сейчас в теме
Оставьте свое сообщение