Понадобилось мне скомпоновать html с выбором цвета в диалоге. И, увы, не так просто оказалось преобразовать элемент стиля в 16-ричную строку. Конечно, есть функции для веб-разработчиков, и где-то на ИС я тоже выкладывал функцию из rgb в hex, но тут понадобилось более масштабно. Нарыл было //infostart.ru/public/115963/, но рано радовался - работает далеко не для всех случаев, а только для элементов стиля в определённых условиях. Никакие фокусы и преобразования не помогли, 1С упрямо поддерживала тот вид цвета, каким он родился изначально. Поэтому я озверел и воспользовался мировой паутиной, откуда вытащил таблицу соответствий. Состряпал функции. Для удобства тестирования обернул в обычную и управляемую формы.
Для тех, кто не может скачивать, публикую тут самое основное:
Функция ПрочитатьТаблицуЦветов(рНижнийРегистр=Ложь) Экспорт
тЦветов=Новый ТаблицаЗначений;
тЦветов.Колонки.Добавить("Название");
тЦветов.Колонки.Добавить("Красный");
тЦветов.Колонки.Добавить("Синий");
тЦветов.Колонки.Добавить("Зеленый");
тЦветов.Колонки.Добавить("Шестнадцатиричный");
мак=ПолучитьМакет("ТаблицаЦветов");
Для й=2 По мак.ВысотаТаблицы Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
мргб=мРазложитьСтрокуВМассивПодстрок(мак.Область(й,2).Текст," ");
стро=тЦветов.Добавить();
стро.Название=мак.Область(й,1).Текст;
стро.Красный=Число(мргб.Получить(0));
стро.Синий=Число(мргб.Получить(1));
стро.Зеленый=Число(мргб.Получить(2));
стро.Шестнадцатиричный=мак.Область(й,3).Текст;
Если рНижнийРегистр Тогда
стро.Название=НРег(стро.Название);
КонецЕсли;
КонецЦикла;
Возврат тЦветов;
КонецФункции
Функция ПолучитьЦветИзСтиляПлатформы(рЦветКакЭлементСтиля) Экспорт
Попытка
// спасибо за идею //infostart.ru/public/115963/, хотя работает только для случая таких стилей
т=Новый ТабличныйДокумент;
т.Область(1,1,1,1).ЦветФона=рЦветКакЭлементСтиля;
вф=ПолучитьИмяВременногоФайла("htm");
т.Записать(вф,ТипФайлаТабличногоДокумента.HTML);
// читаем грубо, без ДокументHTML
рКодПоиска="tr.R0 td.R0C0{ background-color:"; // если 1С изменит формат, эту строку придётся поменять
т=Новый ТекстовыйДокумент;
т.Прочитать(вф);
стро=т.ПолучитьТекст();
пози=Найти(стро,рКодПоиска);
Если пози<>0 Тогда
Возврат ВРег(Сред(стро,пози+СтрДлина(рКодПоиска),8));
КонецЕсли;
Возврат "";
Исключение
Сообщить("ПолучитьЦветИзСтиляПлатформы, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат "";
КонецПопытки;
КонецФункции
Функция ПреобразоватьЦвет(рИсходныйЦвет,рВидИтоговогоЦвета,тЦветов="") Экспорт
Попытка
Если ТипЗнч(рИсходныйЦвет)=Тип("Цвет") Тогда
Если рИсходныйЦвет.Вид=ВидЦвета.ЭлементСтиля Тогда
стрЦвет=ПолучитьЦветИзСтиляПлатформы(рИсходныйЦвет); // вернёт hex, т.е. 16-ричный
Если не ПустаяСтрока(стрЦвет) Тогда
Если рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов();
КонецЕсли;
строц=тЦветов.Найти(стрЦвет,"Шестнадцатиричный");
Если строц<>Неопределено Тогда
Возврат строц.Название;
КонецЕсли;
ИначеЕсли рВидИтоговогоЦвета=2 Тогда // нужен RGB
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов();
КонецЕсли;
строц=тЦветов.Найти(стрЦвет,"Шестнадцатиричный");
Если строц<>Неопределено Тогда
Возврат Новый Структура("Красный,Синий,Зеленый",строц.Красный,строц.Синий,строц.Зеленый);
КонецЕсли;
ИначеЕсли рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
Возврат стрЦвет; // это он и есть
КонецЕсли;
КонецЕсли;
ИначеЕсли рИсходныйЦвет.Вид=ВидЦвета.WebЦвет Тогда
// вытащим из скобок англоязычное написание цвета
стрЦвет=СокрЛП(Строка(рИсходныйЦвет));
пози1=Найти(стрЦвет,"(");
Если пози1<>0 Тогда
стрЦвет=НРег(СтрЗаменить(Сред(стрЦвет,пози1+1),")",""));
Если рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
Возврат стрЦвет; // это он и есть
ИначеЕсли рВидИтоговогоЦвета=2 Тогда // нужен RGB
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов(Истина);
КонецЕсли;
строц=тЦветов.Найти(стрЦвет,"Название");
Если строц<>Неопределено Тогда
Возврат Новый Структура("Красный,Синий,Зеленый",строц.Красный,строц.Синий,строц.Зеленый);
КонецЕсли;
ИначеЕсли рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов(Истина);
КонецЕсли;
строц=тЦветов.Найти(стрЦвет,"Название");
Если строц<>Неопределено Тогда
Возврат строц.Шестнадцатиричный;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли рИсходныйЦвет.Вид=ВидЦвета.Абсолютный Тогда
Если рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов();
КонецЕсли;
отб=Новый Структура("Красный,Синий,Зеленый",рИсходныйЦвет.Красный,рИсходныйЦвет.Синий,рИсходныйЦвет.Зеленый);
мстроц=тЦветов.НайтиСтроки(отб);
Если мстроц.Количество()<>0 Тогда
Возврат мстроц[0].Название;
КонецЕсли;
ИначеЕсли рВидИтоговогоЦвета=2 Тогда // нужен RGB
// фактически, он и есть
Возврат Новый Структура("Красный,Синий,Зеленый",рИсходныйЦвет.Красный,рИсходныйЦвет.Синий,рИсходныйЦвет.Зеленый);
ИначеЕсли рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов();
КонецЕсли;
отб=Новый Структура("Красный,Синий,Зеленый",рИсходныйЦвет.Красный,рИсходныйЦвет.Синий,рИсходныйЦвет.Зеленый);
мстроц=тЦветов.НайтиСтроки(отб);
Если мстроц.Количество()<>0 Тогда
Возврат мстроц[0].Шестнадцатиричный;
КонецЕсли;
КонецЕсли;
КонецЕсли; // по вариантам видов цвета как типа Цвет
ИначеЕсли ТипЗнч(рИсходныйЦвет)=Тип("Строка") Тогда
// ищем во всех колонках таблицы, т.к. заведомо не знаем, какой это цвет
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
тЦветов=ПрочитатьТаблицуЦветов();
КонецЕсли;
строц=тЦветов.Найти(СокрЛП(рИсходныйЦвет));
Если строц<>Неопределено Тогда
Если рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
Возврат строц.Название;
ИначеЕсли рВидИтоговогоЦвета=2 Тогда // нужен RGB
Возврат Новый Структура("Красный,Синий,Зеленый",строц.Красный,строц.Синий,строц.Зеленый);
ИначеЕсли рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
Возврат строц.Шестнадцатиричный;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
Исключение
Сообщить("ПреобразоватьЦвет, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
Саму таблицу легко найти на сайтах наподобие http://www.cloford.com/resources/colours/500col.htm, скопировать и вставить в обычный моксель. Я, увы, закрыл страницу, откуда брал свою табличку, а повторно не нашёл... Кстати, по ссылке больше, чем у меня, но тамошнюю надо слегка причесать под вышеприведённое считывание.
Всё крайне кондово, но может пригодиться. Единственно, учитывайте, что лучше 1 раз прочитать таблицу соответствий и далее по ней искать. Ну и проиндексируйте по нужной колонке, исходя из ситуации.
Тестировалось на 8.2.17