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

9 Comments

  1. AlexxSys

    Странно, при попытке выложить бесплатно пишет запрещено и добавляет сам стартмани ((((

    Reply
  2. YanTsys

    (1) Вот так поневоле люди и становятся миллиардерами:)

    Reply
  3. nomadon

    Текст функции КонвертироватьHexВDec ??

    Reply
  4. AlexxSys

    (3)

    КонвертироватьHexВDec

    Это сделал глобальный модуль расширения базовых функций, и туда такие вот функции складирую …

    Вечером гляну, выложу.

    Reply
  5. AlexxSys

    (3) Выложил

    Reply
  6. Deon

    Для ЭлементСтиля и WebЦвет можно туда-обратно прогонять через ФорматированныйДокумент:

    ФорматированныйДокумент = Новый ФорматированныйДокумент;
    ФорматированныйДокумент.Добавить(«ОпределениеЦвета», Тип(«ТекстФорматированногоДокумента»));
    ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона = Цвет;
    ФорматированныйДокумент.ПолучитьHTML(ТекстХТМЛДокумента, Новый Структура);
    ФорматированныйДокумент.УстановитьHTML(ТекстХТМЛДокумента, Новый Структура);
    
    АбсолютныйЦвет = ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона;
    
    Reply
  7. AlexxSys

    Не совсем. Насколько я помню ФорматированныйДокумент не доступен на сервере. Это единственный быстрый и универсальный вариант

    Reply
  8. RocKeR_13

    А еще есть замечательная утилита Pixie, не требующая установки)

    Reply
  9. Zero_nv

    Для цвета типа ЭлементСтиля фокус через форматированный документ не работает (платформа 8.3.12 без совместимости). Приходится получать абсолютный цвет через табличный документ (запись, а потом чтение).

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *