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

14.09.17

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

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

Файлы

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

Наименование Скачано Купить файл
Макет получение RGB (HEX) цвета
.mxl 23,13Kb
48 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

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

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Уже не первый раз появилась необходимость получить 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С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    85153    60    42    

72

Работа с интерфейсом Рабочее место 1С:Предприятие 8 1C:Бухгалтерия 1С:Комплексная автоматизация 2.х Платные (руб)

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

6100 руб.

16.01.2015    68717    46    60    

85

Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

5246 руб.

29.06.2020    25054    34    6    

53

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

6088 руб.

17.10.2025    2344    3    0    

2

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.

36600 руб.

28.08.2025    8328    2    2    

6

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

20.08.2024    50776    mrXoxot    44    

139

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

27.05.2024    26846    smielka    39    

117

Инструментарий разработчика Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    17744    182    acces969    31    

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

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

АбсолютныйЦвет = ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона;
daMaster; +1 Ответить
7. AlexxSys 186 09.05.18 20:07 Сейчас в теме
Не совсем. Насколько я помню ФорматированныйДокумент не доступен на сервере. Это единственный быстрый и универсальный вариант
8. RocKeR_13 1478 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
user2142141; Lapitskiy; Gorus; scape; Чародей; KoC_one; PeterGr; +7 Ответить
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);   
	Возврат Структура; 
	
КонецФункции
Показать
Для отправки сообщения требуется регистрация/авторизация