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

14.09.17

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Макет получение 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С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55303    17    23    

43

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

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63698    44    59    

82

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

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

2400 руб.

29.06.2020    19548    27    6    

42

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

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

1500 руб.

06.10.2020    10768    7    7    

11

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

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

20.08.2024    20824    mrXoxot    44    

128

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

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

27.05.2024    10308    smielka    37    

105

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

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

27.12.2023    17740    1223    elcoan    53    

125
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. AlexxSys 183 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 183 15.09.17 13:32 Сейчас в теме
(3)
КонвертироватьHexВDec

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

АбсолютныйЦвет = ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона;
daMaster; +1 Ответить
7. AlexxSys 183 09.05.18 20:07 Сейчас в теме
Не совсем. Насколько я помню ФорматированныйДокумент не доступен на сервере. Это единственный быстрый и универсальный вариант
8. RocKeR_13 1378 26.08.19 11:05 Сейчас в теме
А еще есть замечательная утилита Pixie, не требующая установки)
9. Zero_nv 128 09.10.19 05:33 Сейчас в теме
Для цвета типа ЭлементСтиля фокус через форматированный документ не работает (платформа 8.3.12 без совместимости). Приходится получать абсолютный цвет через табличный документ (запись, а потом чтение).
ZDmitry83; +1 Ответить
10. Spartan 366 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);   
	Возврат Структура; 
	
КонецФункции
Показать
Оставьте свое сообщение