Функция Счисления_10_В_16(Знач ИсхЧисло)
рОснование=16; // некоторые выносят в аргумент, получая универсал
рРезультат="";
//
Пока ИсхЧисло<>0 Цикл
рРезультат=Сред("0123456789ABCDEF", (ИсхЧисло % рОснование)+1, 1)+рРезультат;
ИсхЧисло=Цел(ИсхЧисло/рОснование);
КонецЦикла;
//
Возврат рРезультат;
КонецФункции
Функция Счисления_16_В_10(ИсхСтрока) Экспорт
рРезультат=0;
//
рДлина=СтрДлина(ИсхСтрока);
Для й=1 По рДлина Цикл
исхсим=Сред(ИсхСтрока, й, 1);
пози=СтрНайти("0123456789ABCDEF", ВРег(исхсим));
Если пози=0 Тогда
Сообщить("Счисления_16_В_10: в числе "+ИсхСтрока+" встречен недопустимый символ: """+исхсим+"""!");
Возврат 0;
КонецЕсли;
рРезультат=рРезультат + (пози-1) * Pow(16, рДлина-й);
КонецЦикла;
//
Возврат рРезультат;
КонецФункции
Функция ПолучитьЗначениеИзЛюбогоЦвета(ИсхЦвет) Экспорт
Попытка
Если ТипЗнч(ИсхЦвет)<>Тип("Цвет") Тогда Возврат "" КонецЕсли;
//
рЗначение=СериализаторXDTO.ЗаписатьXDTO(ИсхЦвет).ЛексическоеЗначение; // использование СериализаторXDTO.ЗаписатьXML даёт примерно то же, только разбирать сложнее
//
Если ИсхЦвет.Вид=ВидЦвета.WebЦвет Тогда // возвращает английское имя в общепринятой нотации (например, "Coral")
рЗначение=СтрЗаменить(рЗначение, "{http://v8.1c.ru/8.1/data/ui/colors/web}", "");
ИначеЕсли ИсхЦвет.Вид=ВидЦвета.WindowsЦвет Тогда // возвращает английское имя в общепринятой нотации (например, "MenuItemText")
рЗначение=СтрЗаменить(рЗначение, "{http://v8.1c.ru/8.1/data/ui/colors/windows}", "");
ИначеЕсли ИсхЦвет.Вид=ВидЦвета.Абсолютный Тогда // возвращает hex-значение цвета
рЗначение=СтрЗаменить(рЗначение, "#", "");
Иначе
// элементы стиля следует разыменовывать до их Значение, а для авто-цвета так и будет "auto"
КонецЕсли;
Возврат рЗначение;
Исключение
Сообщить("ПолучитьЗначениеИзЛюбогоЦвета, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат "";
КонецПопытки;
КонецФункции
Функция ПолучитьHexЦветаИзЛюбогоЦвета_ФорматированнаяСтрока(ИсхЦвет) Экспорт
Попытка
Если ТипЗнч(ИсхЦвет)<>Тип("Цвет") Тогда Возврат "" КонецЕсли;
//
фс=Новый ФорматированнаяСтрока("Текст", , ИсхЦвет);
серифс=СериализаторXDTO.XMLСтрока(фс);
//
// желающие могут сделать это же регулярным выражением
пози=СтрНайти(НРег(серифс), "<color #");
Если пози=0 Тогда Возврат "" КонецЕсли;
серифс=Сред(серифс, пози+8);
пози=СтрНайти(серифс, ">"); // хотя можно и просто Лев(серифс, 6)
Если пози=0 Тогда Возврат "" КонецЕсли;
Возврат Лев(серифс, пози-1);
//
Исключение
Сообщить("ПолучитьHexЦветаИзЛюбогоЦвета_ФорматированнаяСтрока, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат "";
КонецПопытки;
КонецФункции
Функция ПолучитьHexЦветаИзАбсолютного(АбсЦвет) Экспорт
Попытка
Если ТипЗнч(АбсЦвет)<>Тип("Цвет") Тогда Возврат "" КонецЕсли;
Если АбсЦвет.Вид<>ВидЦвета.Абсолютный Тогда Возврат "" КонецЕсли;
//
// на поздних релизах можно побитовым сдвигом влево (см. //infostart.ru/public/860960/)
хКрасный=?(АбсЦвет.Красный=0, "00", Счисления_10_В_16(АбсЦвет.Красный));
хЗелёный=?(АбсЦвет.Зеленый=0, "00", Счисления_10_В_16(АбсЦвет.Зеленый));
хСиний=?(АбсЦвет.Синий=0, "00", Счисления_10_В_16(АбсЦвет.Синий));
//
Возврат хКрасный+хЗелёный+хСиний;
//
Исключение
Сообщить("ПолучитьHexЦветаИзАбсолютного, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат "";
КонецПопытки;
КонецФункции
Функция ПолучитьАбсолютныйЦветИзHex(Знач ИсхHex) Экспорт
Попытка
Если ПустаяСтрока(ИсхHex) Тогда Возврат Неопределено КонецЕсли;
Если СтрНачинаетсяС(ИсхHex, "#") Тогда ИсхHex=СтрЗаменить(ИсхHex, "#", "") КонецЕсли;
//
// желающие могут сделать это же регулярным выражением ?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})
хКрасный=Сред(ИсхHex, 1, 2);
хЗелёный=Сред(ИсхHex, 3, 2);
хСиний=Сред(ИсхHex, 5, 2);
рКрасный=?(хКрасный="00", 0, Счисления_16_В_10(хКрасный));
рЗелёный=?(хЗелёный="00", 0, Счисления_16_В_10(хЗелёный));
рСиний=?(хСиний="00", 0, Счисления_16_В_10(хСиний));
//
Возврат Новый Цвет(рКрасный, рЗелёный, рСиний);
//
Исключение
Сообщить("ПолучитьАбсолютныйЦветИзHex, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Может использоваться для работы с цветами MS Office
Функция ПолучитьLongЦветаИзАбсолютного(АбсЦвет) Экспорт
Если ТипЗнч(АбсЦвет)<>Тип("Цвет") Тогда Возврат 0 КонецЕсли;
Если АбсЦвет.Вид<>ВидЦвета.Абсолютный Тогда Возврат 0 КонецЕсли;
//
Возврат (((АбсЦвет.Синий * 256) + АбсЦвет.Зеленый) * 256 + АбсЦвет.Красный); // или можно Красный * 65536 + Зелёный * 256 + Синий; или побитовым сдвигом (Красный << 16) + (Зелёный << 8) + Синий;
КонецФункции
// Может использоваться для работы с цветами MS Office
Функция ПолучитьАбсолютныйЦветИзLong(ИсхLong) Экспорт
Попытка
рКрасный=ИсхLong % 256;
рЗелёный=(Цел(ИсхLong / 256)) % 256;
рСиний=(Цел(ИсхLong / 65535)) % 256;
Возврат Новый Цвет(рКрасный, рЗелёный, рСиний);
Исключение
Сообщить("ПолучитьАбсолютныйЦветИзLong, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Практически, аналог ПолучитьИндексИзWebWindowsЦвета
Функция ПолучитьLongЦветаИзАбсолютного2(АбсЦвет) Экспорт
Попытка
Если ТипЗнч(АбсЦвет)<>Тип("Цвет") Тогда Возврат 0 КонецЕсли;
Если АбсЦвет.Вид<>ВидЦвета.Абсолютный Тогда Возврат 0 КонецЕсли;
//
стро=СтрЗаменить(ЗначениеВСтрокуВнутр(АбсЦвет), Символы.ПС, "");
//
// желающие могут сделать это же регулярным выражением
пози=СтрНайти(стро, ",{3,0,{");
Если пози=0 Тогда Возврат 0 КонецЕсли;
стро=Сред(стро, пози+7);
пози=СтрНайти(стро, "}");
Если пози=0 Тогда Возврат 0 КонецЕсли;
стрЧисло=Лев(стро, пози-1);
//
Возврат Число(СокрЛП(стрЧисло));
//
Исключение
Сообщить("ПолучитьLongЦветаИзАбсолютного2, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат 0;
КонецПопытки;
КонецФункции
// Практически, аналог ПолучитьWebWindowsЦветИзИндекса
Функция ПолучитьАбсолютныйЦветИзLong2(ИсхLong) Экспорт
Попытка
Если ИсхLong=0 Тогда Возврат Неопределено КонецЕсли;
//
стро="{""#"",9cd510c7-abfc-11d4-9434-004095e12fc7,2,"+Символы.ПС+"{3,0,"+Символы.ПС+"{"+Формат(ИсхLong, "ЧГ=0")+"}"+Символы.ПС+"}"+Символы.ПС+"}";
Возврат ЗначениеИзСтрокиВнутр(стро);
Исключение
Сообщить("ПолучитьАбсолютныйЦветИзLong2, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ПолучитьWebWindowsЦветИзИндекса(ИндексЦвета, НужныйВид) Экспорт
Попытка
Если ИндексЦвета=0 Тогда Возврат Неопределено КонецЕсли;
//
рКод=?(НужныйВид=ВидЦвета.WebЦвет, "2", "1");
стро="{""#"",9cd510c7-abfc-11d4-9434-004095e12fc7,2,"+Символы.ПС+"{3,"+рКод+","+Символы.ПС+"{"+Формат(ИндексЦвета, "ЧГ=0")+"}"+Символы.ПС+"}"+Символы.ПС+"}";
Возврат ЗначениеИзСтрокиВнутр(стро);
Исключение
Сообщить("ПолучитьWebWindowsЦветИзИндекса, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ПолучитьИндексИзWebWindowsЦвета(ИсхЦвет) Экспорт
Попытка
Если ТипЗнч(ИсхЦвет)<>Тип("Цвет") Тогда Возврат 0 КонецЕсли;
Если ИсхЦвет.Вид<>ВидЦвета.WebЦвет и ИсхЦвет.Вид<>ВидЦвета.WindowsЦвет Тогда Возврат 0 КонецЕсли;
//
стро=СтрЗаменить(ЗначениеВСтрокуВнутр(ИсхЦвет), Символы.ПС, "");
//
// желающие могут сделать это же регулярным выражением
рКод=?(ИсхЦвет.Вид=ВидЦвета.WebЦвет, "2", "1");
пози=СтрНайти(стро, ",{3,"+рКод+",{");
Если пози=0 Тогда Возврат 0 КонецЕсли;
стро=Сред(стро, пози+7);
пози=СтрНайти(стро, "}");
Если пози=0 Тогда Возврат 0 КонецЕсли;
стрЧисло=Лев(стро, пози-1);
//
Возврат Число(СокрЛП(стрЧисло));
//
Исключение
Сообщить("ПолучитьИндексИзWebWindowsЦвета, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат 0;
КонецПопытки;
КонецФункции
// Использует запись временного файла на диск, требует такой возможности и более длительна!
Функция ПреобразоватьЛюбойЦветВАбсолютный_ТабДокумент(ИсхЦвет) Экспорт
Попытка
Если ТипЗнч(ИсхЦвет)<>Тип("Цвет") Тогда Возврат Неопределено КонецЕсли;
Если ИсхЦвет.Вид=ВидЦвета.Абсолютный Тогда Возврат ИсхЦвет КонецЕсли; // и так уже нужный
//
имяф=ПолучитьИмяВременногоФайла("xlsx"); // теоретически, работает, даже если экселя нет на ПК
т=Новый ТабличныйДокумент;
обл=т.Область(1,1,1,1);
обл.ЦветФона=ИсхЦвет;
//
т.Записать(имяф, ТипФайлаТабличногоДокумента.XLSX); // именно так, неявное преобразование
//
т=Новый ТабличныйДокумент;
т.Прочитать(имяф);
обл=т.Область(1,1,1,1);
Возврат обл.ЦветФона; // и это уже абсолютный
//
Исключение
Сообщить("ПреобразоватьЛюбойЦветВАбсолютный_ТабДокумент, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Очень рекомендуется использовать в модулях ПовтИсп с кэшированием на сеанс.
Функция ПреобразоватьАбсолютныйВWebWindowsЦвет(АбсЦвет, НужныйВид) Экспорт
Попытка
Если АбсЦвет.Вид<>ВидЦвета.Абсолютный Тогда Возврат Неопределено КонецЕсли;
//
исхКрасный=АбсЦвет.Красный;
исхЗелёный=АбсЦвет.Зеленый;
исхСиний=АбсЦвет.Синий;
//
квоКодов=?(НужныйВид=ВидЦвета.WebЦвет, 146, 28);
Для й=1 По квоКодов Цикл
рЦвет=ПолучитьWebWindowsЦветИзИндекса(й, НужныйВид);
Если рЦвет=Неопределено Тогда Продолжить КонецЕсли;
//
рHex=ПолучитьHexЦветаИзЛюбогоЦвета_ФорматированнаяСтрока(рЦвет);
Если ПустаяСтрока(рHex) Тогда Продолжить КонецЕсли;
//
хКрасный=Сред(рHex, 1, 2);
хЗелёный=Сред(рHex, 3, 2);
хСиний=Сред(рHex, 5, 2);
рКрасный=?(хКрасный="00", 0, Счисления_16_В_10(хКрасный));
рЗелёный=?(хЗелёный="00", 0, Счисления_16_В_10(хЗелёный));
рСиний=?(хСиний="00", 0, Счисления_16_В_10(хСиний));
Если рКрасный=исхКрасный и рЗелёный=исхЗелёный и рСиний=исхСиний Тогда
Возврат рЦвет;
КонецЕсли;
КонецЦикла;
//
Возврат Неопределено; // не нашли подходящий цвет...
Исключение
Сообщить("ПреобразоватьАбсолютныйВWebWindowsЦвет, общая ошибка: "+ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции