Конвертация относительных цветов в абсолютные (RGB)
Способ конвертации палитры относительных цветов 1С в абсолютные с помощью механизмов HTML, XSLT и XDTO.
- Описание
- Подробнее
Описание
Выражаю огромную благодарность автору AlexxSys за его публикацию Получение RGB (HEX) цвета.
Как известно в 1С цвета делятся по следующим видам:
- WebЦвет (WebColor) — задается палитрой Web-цветов. Самая богатая палитра в которой можно найти цвета практически на любой вкус.
- WindowsЦвет (WindowsColor) — задается палитрой операционной системы. Интересно на linux она пустая?)
- АвтоЦвет (AutoColor) — контекстоно-зависимый цвет, который определятся платформой в зависимости от свойства объекта для которого он задается.
- ЭлементСтиля (StyleItem) — Задается палитрой цветов стиля, которую определяет разработчик конфигурации.
- Абсолютный (Absolute) -Произвольный цвет, который задается абсолютным значением сочетания красного, зеленого и синего компонента.
Проблема заключается в том, что только объект цвета с абсолютным видом содержит значения RGB компонент. По работе с столкнулся с проблемой, что нужно получить из любого вида цвета абсолютные значения RGB компонент. Очень помогла статья AlexxSys с выбором объекта, который умеет вытаскивать HEX значение переданного цвета. В начале экспериментировал с форматированной строкой, но выяснилось, что она не умеет доставать HEX из палитры Windows-цветов.
Представляю на суд общественности метод, который позволяется с помощью HTML, XSLT и XDTO получить массив цветов с абсолютными значениями RGB компонент.
Немного о костылях
Почему-то цвет фона элемента форматированного документа не устанавливается первого раза. Так же обратил внимание, что автор оригинальной публикации тоже извращался с установкой цвета "ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона = Цвет", возможно по той же причине. Если знаете, как победить эту напасть просьба написать в комментарии.
Процедура КонвертироватьСистемыеЦветаВАбсолютные(ПалитраЦветов)Экспорт
КонвертируемыеСтроки = Новый Массив;
ФорматированныйДокумент = Новый ФорматированныйДокумент;
// Подготовим список цветов
Для Каждого СтрокаСписка Из ПалитраЦветов Цикл
Цвет = СтрокаСписка.Значение;
Если Цвет.Вид = ВидЦвета.Абсолютный Тогда
Продолжить;
КонецЕсли;
Если ПустаяСтрока(СтрокаСписка.Представление) Тогда
СтрокаСписка.Представление = Строка(Цвет);
КонецЕсли;
Если Цвет.Вид = ВидЦвета.АвтоЦвет Тогда
// Авто цвет, можно узнать только из контекста использования
СтрокаСписка.Значение = Новый Цвет(0, 0, 0);
Продолжить;
КонецЕсли;
КонвертируемыеСтроки.Добавить(СтрокаСписка);
Элемент = ФорматированныйДокумент.Добавить("Текст", Тип("ТекстФорматированногоДокумента"));
Элемент.ЦветФона = Цвет;
// Ошибка а платформе 8.3.15.1830, так же ошибка воспроизводится и на платформе 8.3.17.1549
// Цвет устанавливается только со второго раза.
Элемент.ЦветФона = Цвет;
КонецЦикла;
// Получим массив цветов
ТаблицаСтилей =
"<xsl:stylesheet version=""1.0"" xmlns=""http://v8.1c.ru/8.1/data/core"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
| <xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes""/>
| <xsl:template match=""/"">
| <Array xsi:type=""Array"">
| <xsl:for-each select=""/html/body//span"">
| <xsl:if test=""substring-after(@style, '#') != ''"">
| <Value xmlns:d2p1=""http://v8.1c.ru/8.1/data/ui"" xsi:type=""d2p1:Color"">
| <xsl:text>#</xsl:text>
| <xsl:value-of select=""substring(substring-after(@style, '#'), 1, 6)""/>
| </Value>
| </xsl:if>
| </xsl:for-each>
| </Array>
| </xsl:template>
|</xsl:stylesheet>";
Процессор = Новый ПреобразованиеXSL;
Процессор.ЗагрузитьТаблицуСтилейXSLИзСтроки(ТаблицаСтилей);
СтрокаHTML = "";
ФорматированныйДокумент.ПолучитьHTML(СтрокаHTML, Новый Структура);
КонвертируемыеЦвета = Процессор.ПреобразоватьИзСтроки(СтрокаHTML);
КонвертируемыеЦвета = ОбщегоНазначения.ЗначениеИзСтрокиXML(КонвертируемыеЦвета);
// Заместим исходные цвета
Индекс = 0;
Для Каждого СтрокаСписка Из КонвертируемыеСтроки Цикл
СтрокаСписка.Значение = КонвертируемыеЦвета[Индекс];
Индекс = Индекс + 1;
КонецЦикла;
КонецПроцедуры