Каталог решений - Конвертация относительных цветов в абсолютные (RGB)

Конвертация относительных цветов в абсолютные (RGB)

Конвертация относительных цветов в абсолютные (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;
		
	КонецЦикла;
	
КонецПроцедуры

 

has been added to your cart:
Оформление заказа