Получение RGB (HEX) цвета

14.09.17

Разработка - Работа с интерфейсом

Получение RGB (HEX) цвета из любого вида цветов 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Макет получение RGB (HEX) цвета
.mxl 23,13Kb
45
45
1 SM
Скачать Купить за 1 850 руб.

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

RGB цвет ЭлементСтиля  Абсолютный  WebЦвет  WindowsЦвет получение RGB

См. также

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    17628    24    6    

38

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    5373    smielka    37    

95

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    12405    788    elcoan    47    

110

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    10632    158    acces969    31    

120

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    4586    kalyaka    6    

32

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    9359    1    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. AlexxSys 331 14.09.17 23:43 Сейчас в теме
Странно, при попытке выложить бесплатно пишет запрещено и добавляет сам стартмани ((((
2. YanTsys 12 15.09.17 09:05 Сейчас в теме
(1) Вот так поневоле люди и становятся миллиардерами:)
3. nomadon 369 15.09.17 11:24 Сейчас в теме
Текст функции КонвертироватьHexВDec ??
4. AlexxSys 331 15.09.17 13:32 Сейчас в теме
(3)
КонвертироватьHexВDec

Это сделал глобальный модуль расширения базовых функций, и туда такие вот функции складирую ...
Вечером гляну, выложу.
5. AlexxSys 331 15.09.17 22:32 Сейчас в теме
6. Deon 08.05.18 23:12 Сейчас в теме
Для ЭлементСтиля и WebЦвет можно туда-обратно прогонять через ФорматированныйДокумент:
ФорматированныйДокумент = Новый ФорматированныйДокумент; 
ФорматированныйДокумент.Добавить("ОпределениеЦвета", Тип("ТекстФорматированногоДокумента")); 
ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона = Цвет; 
ФорматированныйДокумент.ПолучитьHTML(ТекстХТМЛДокумента, Новый Структура); 
ФорматированныйДокумент.УстановитьHTML(ТекстХТМЛДокумента, Новый Структура); 

АбсолютныйЦвет = ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона;
daMaster; +1 Ответить
7. AlexxSys 331 09.05.18 20:07 Сейчас в теме
Не совсем. Насколько я помню ФорматированныйДокумент не доступен на сервере. Это единственный быстрый и универсальный вариант
8. RocKeR_13 1345 26.08.19 11:05 Сейчас в теме
А еще есть замечательная утилита Pixie, не требующая установки)
9. Zero_nv 128 09.10.19 05:33 Сейчас в теме
Для цвета типа ЭлементСтиля фокус через форматированный документ не работает (платформа 8.3.12 без совместимости). Приходится получать абсолютный цвет через табличный документ (запись, а потом чтение).
ZDmitry83; +1 Ответить
10. Spartan 365 12.03.20 13:35 Сейчас в теме
(0) В Вашей таблице есть дубли цветов, причем с неправильными кодами. Таблицу исправил и переделал функцию получения цвета - теперь она возвращает Абсолютный RGB Цвет, а дальше можно с ним делать что угодно, в том числе представить в виде строки.

// Функция конвертирует hex в dec
//
Функция итКонвертироватьHexВDec(Знач ЧислоСтрокой)
	
	Результат = 0;
	Шаблон = "0123456789ABCDEF";
	
	ЧислоСтрокой = ВРег(Строка(ЧислоСтрокой));
	Для ТекущийСимвол = 1 По СтрДлина(ЧислоСтрокой) Цикл
		ПозицияВШаблоне = Найти(Шаблон, Сред(ЧислоСтрокой, ТекущийСимвол, 1))-1;
		Результат = Результат * СтрДлина(Шаблон) + ПозицияВШаблоне;
	КонецЦикла;
	
	Возврат Результат;

КонецФункции

// Функция загружает данные из макета в таблицу значений
//
Функция итЗагрузитьТаблицуИзМакета(ИмяМакета, ИмяОбласти) Экспорт
	
	Макет = ПолучитьМакет(ИмяМакета);
	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Макет.Область(ИмяОбласти));
	
	// Возвращаем таблицу значений с отобранными из макета данными 
	ПостроительЗапроса.Выполнить();
		
	Возврат ПостроительЗапроса.Результат.Выгрузить();
	
КонецФункции

// Функция получает абсолютный RGBЦвет
//
Функция итПолучитьАбсолютныйRGBЦвет(Знач Цвет) Экспорт
	
	// Приводим цвет стиля к простому RGB, Абсолютному, Windows-цвету
	Если Цвет.Вид = ВидЦвета.ЭлементСтиля Тогда 
		ОбъектМетаданныхСтиля = Метаданные.ЭлементыСтиля.Найти(Сред(Строка(Цвет), 8));
		Если ОбъектМетаданныхСтиля <> Неопределено Тогда 
			Цвет = ОбъектМетаданныхСтиля.Значение;
		КонецЕсли;
	КонецЕсли;
	
	//Получаем RGB цвет из макета
	Если Цвет.Вид = ВидЦвета.Абсолютный Тогда
		Возврат Цвет;
	ИначеЕсли Цвет.Вид = ВидЦвета.WebЦвет Тогда
		ТаблицаСоответствияЦветов = итЗагрузитьТаблицуИзМакета("СоответствиеЦветовWebИRGB", "ДанныеСоответствияЦветов");
		
		ЦветИмяПриведеное = Строка(Цвет);
		ЦветИмяПриведеное = Сред(ЦветИмяПриведеное, Найти(ЦветИмяПриведеное, "(") + 1);
		ЦветИмяПриведеное = Сред(ЦветИмяПриведеное, 1, Найти(ЦветИмяПриведеное, ")") - 1);
		
		НайденнаяСтрока = ТаблицаСоответствияЦветов.Найти(ЦветИмяПриведеное, "ИмяЦвета");
		Если НайденнаяСтрока <> Неопределено Тогда
			Возврат Новый Цвет(Число(НайденнаяСтрока.R), Число(НайденнаяСтрока.G), Число(НайденнаяСтрока.B));
		Иначе
			Возврат Новый Цвет(0, 0, 0);
		КонецЕсли;
	ИначеЕсли Цвет.Вид = ВидЦвета.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)));
	ИначеЕсли Цвет.Вид = ВидЦвета.АвтоЦвет Тогда
		// Пустой цвет (определяется элементом владельцем, не содержит сам цвет)
		Возврат Новый Цвет(0, 0, 0);
	КонецЕсли;

КонецФункции
Показать
Прикрепленные файлы:
СоответствиеЦветовWebИRGB.mxl
Lapitskiy; Gorus; scape; Чародей; KoC_one; PeterGr; +6 Ответить
11. Aleksey-f 26.01.24 21:37 Сейчас в теме
Функция ВыполнитьПреобразование(HEX) Экспорт 
	
	Если СтрДлина(HEX) = 4 Тогда
		RED   = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 2, 1)+Сред(HEX, 2, 1)); 	
		GREEN =	ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 3, 1)+Сред(HEX, 3, 1));
		BLUE  = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 4, 1)+Сред(HEX, 4, 1));
		
	ИначеЕсли СтрДлина(HEX) = 7 Тогда
		RED   = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 2, 2)); 	
		GREEN =	ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 4, 2));
		BLUE  = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 6, 2));
	Иначе
		Возврат;
	КонецЕсли;

	//RED   = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 2, 2)); 	
	//GREEN =	ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 4, 2));
	//BLUE  = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(HEX, 6, 2));
	//
	RGB   = Строка(RED) + ", " + Строка(GREEN) + ", " + Строка(BLUE);
	Структура = Новый Структура;
	Структура.Вставить("RED",	RED);
	Структура.Вставить("GREEN",	GREEN);
	Структура.Вставить("BLUE",	BLUE);   
	Возврат Структура; 
	
КонецФункции
Показать
Оставьте свое сообщение