Преобразования цвета: RGB, Web, Hex, 1С

23.09.13

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

У вас есть поле "Цвет" на форме. А что дальше?..
Эта обработка и приведённые функции позволят легко манипулировать такими разными ипостасями понятия "Цвет". Очень простое, топорное и понятное, решение.

Скачать файлы

Наименование Файл Версия Размер
ПреобразованиеЦветов
.epf 21,10Kb
80
.epf 21,10Kb 80 Скачать

Понадобилось мне скомпоновать html с выбором цвета в диалоге. И, увы, не так просто оказалось преобразовать элемент стиля в 16-ричную строку. Конечно, есть функции для веб-разработчиков, и где-то на ИС я тоже выкладывал функцию из rgb в hex, но тут понадобилось более масштабно. Нарыл было //infostart.ru/public/115963/, но рано радовался - работает далеко не для всех случаев, а только для элементов стиля в определённых условиях. Никакие фокусы и преобразования не помогли, 1С упрямо поддерживала тот вид цвета, каким он родился изначально. Поэтому я озверел и воспользовался мировой паутиной, откуда вытащил таблицу соответствий. Состряпал функции. Для удобства тестирования обернул в обычную и управляемую формы.

Для тех, кто не может скачивать, публикую тут самое основное:


Функция ПрочитатьТаблицуЦветов(рНижнийРегистр=Ложь) Экспорт
   
тЦветов=Новый ТаблицаЗначений;
   
тЦветов.Колонки.Добавить("Название");
   
тЦветов.Колонки.Добавить("Красный");
   
тЦветов.Колонки.Добавить("Синий");
   
тЦветов.Колонки.Добавить("Зеленый");
   
тЦветов.Колонки.Добавить("Шестнадцатиричный");
   
мак=ПолучитьМакет("ТаблицаЦветов");
    Для
й=2 По мак.ВысотаТаблицы Цикл
       
#Если Клиент Тогда
           
ОбработкаПрерыванияПользователя();
       
#КонецЕсли
       
мргб=мРазложитьСтрокуВМассивПодстрок(мак.Область(й,2).Текст," ");
       
стро=тЦветов.Добавить();
       
стро.Название=мак.Область(й,1).Текст;
       
стро.Красный=Число(мргб.Получить(0));
       
стро.Синий=Число(мргб.Получить(1));
       
стро.Зеленый=Число(мргб.Получить(2));
       
стро.Шестнадцатиричный=мак.Область(й,3).Текст;
        Если
рНижнийРегистр Тогда
           
стро.Название=НРег(стро.Название);
        КонецЕсли;
    КонецЦикла;
    Возврат
тЦветов;
КонецФункции


Функция
ПолучитьЦветИзСтиляПлатформы(рЦветКакЭлементСтиля) Экспорт
Попытка
   
// спасибо за идею //infostart.ru/public/115963/, хотя работает только для случая таких стилей
   
т=Новый ТабличныйДокумент;
   
т.Область(1,1,1,1).ЦветФона=рЦветКакЭлементСтиля;
   
вф=ПолучитьИмяВременногоФайла("htm");
   
т.Записать(вф,ТипФайлаТабличногоДокумента.HTML);
   
// читаем грубо, без ДокументHTML
   
рКодПоиска="tr.R0 td.R0C0{ background-color:"; // если 1С изменит формат, эту строку придётся поменять
   
т=Новый ТекстовыйДокумент;
   
т.Прочитать(вф);
   
стро=т.ПолучитьТекст();
   
пози=Найти(стро,рКодПоиска);
    Если
пози<>0 Тогда
        Возврат
ВРег(Сред(стро,пози+СтрДлина(рКодПоиска),8));
    КонецЕсли;
    Возврат
"";
Исключение
   
Сообщить("ПолучитьЦветИзСтиляПлатформы, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
    Возврат
"";
КонецПопытки;
КонецФункции


Функция
ПреобразоватьЦвет(рИсходныйЦвет,рВидИтоговогоЦвета,тЦветов="") Экспорт
Попытка
    Если
ТипЗнч(рИсходныйЦвет)=Тип("Цвет") Тогда
        Если
рИсходныйЦвет.Вид=ВидЦвета.ЭлементСтиля Тогда
           
стрЦвет=ПолучитьЦветИзСтиляПлатформы(рИсходныйЦвет); // вернёт hex, т.е. 16-ричный
           
Если не ПустаяСтрока(стрЦвет) Тогда
                Если
рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
                   
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
                       
тЦветов=ПрочитатьТаблицуЦветов();
                    КонецЕсли;
                   
строц=тЦветов.Найти(стрЦвет,"Шестнадцатиричный");
                    Если
строц<>Неопределено Тогда
                        Возврат
строц.Название;
                    КонецЕсли;
                ИначеЕсли
рВидИтоговогоЦвета=2 Тогда // нужен RGB
                   
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
                       
тЦветов=ПрочитатьТаблицуЦветов();
                    КонецЕсли;
                   
строц=тЦветов.Найти(стрЦвет,"Шестнадцатиричный");
                    Если
строц<>Неопределено Тогда
                        Возврат Новый
Структура("Красный,Синий,Зеленый",строц.Красный,строц.Синий,строц.Зеленый);
                    КонецЕсли;
                ИначеЕсли
рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
                   
Возврат стрЦвет; // это он и есть
               
КонецЕсли;
            КонецЕсли;

        ИначеЕсли
рИсходныйЦвет.Вид=ВидЦвета.WebЦвет Тогда
           
// вытащим из скобок англоязычное написание цвета
           
стрЦвет=СокрЛП(Строка(рИсходныйЦвет));
           
пози1=Найти(стрЦвет,"(");
            Если
пози1<>0 Тогда
               
стрЦвет=НРег(СтрЗаменить(Сред(стрЦвет,пози1+1),")",""));
                Если
рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
                   
Возврат стрЦвет; // это он и есть
               
ИначеЕсли рВидИтоговогоЦвета=2 Тогда // нужен RGB
                   
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
                       
тЦветов=ПрочитатьТаблицуЦветов(Истина);
                    КонецЕсли;
                   
строц=тЦветов.Найти(стрЦвет,"Название");
                    Если
строц<>Неопределено Тогда
                        Возврат Новый
Структура("Красный,Синий,Зеленый",строц.Красный,строц.Синий,строц.Зеленый);
                    КонецЕсли;
                ИначеЕсли
рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
                   
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
                       
тЦветов=ПрочитатьТаблицуЦветов(Истина);
                    КонецЕсли;
                   
строц=тЦветов.Найти(стрЦвет,"Название");
                    Если
строц<>Неопределено Тогда
                        Возврат
строц.Шестнадцатиричный;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;

        ИначеЕсли
рИсходныйЦвет.Вид=ВидЦвета.Абсолютный Тогда
            Если
рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
               
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
                   
тЦветов=ПрочитатьТаблицуЦветов();
                КонецЕсли;
               
отб=Новый Структура("Красный,Синий,Зеленый",рИсходныйЦвет.Красный,рИсходныйЦвет.Синий,рИсходныйЦвет.Зеленый);
               
мстроц=тЦветов.НайтиСтроки(отб);
                Если
мстроц.Количество()<>0 Тогда
                    Возврат
мстроц[0].Название;
                КонецЕсли;
            ИначеЕсли
рВидИтоговогоЦвета=2 Тогда // нужен RGB
                // фактически, он и есть
               
Возврат Новый Структура("Красный,Синий,Зеленый",рИсходныйЦвет.Красный,рИсходныйЦвет.Синий,рИсходныйЦвет.Зеленый);
            ИначеЕсли
рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
               
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
                   
тЦветов=ПрочитатьТаблицуЦветов();
                КонецЕсли;
               
отб=Новый Структура("Красный,Синий,Зеленый",рИсходныйЦвет.Красный,рИсходныйЦвет.Синий,рИсходныйЦвет.Зеленый);
               
мстроц=тЦветов.НайтиСтроки(отб);
                Если
мстроц.Количество()<>0 Тогда
                    Возврат
мстроц[0].Шестнадцатиричный;
                КонецЕсли;
            КонецЕсли;

        КонецЕсли;
// по вариантам видов цвета как типа Цвет

   
ИначеЕсли ТипЗнч(рИсходныйЦвет)=Тип("Строка") Тогда
       
// ищем во всех колонках таблицы, т.к. заведомо не знаем, какой это цвет
       
Если ТипЗнч(тЦветов)<>Тип("ТаблицаЗначений") Тогда
           
тЦветов=ПрочитатьТаблицуЦветов();
        КонецЕсли;
       
строц=тЦветов.Найти(СокрЛП(рИсходныйЦвет));
        Если
строц<>Неопределено Тогда
            Если
рВидИтоговогоЦвета=1 Тогда // нужен web-цвет
               
Возврат строц.Название;
            ИначеЕсли
рВидИтоговогоЦвета=2 Тогда // нужен RGB
               
Возврат Новый Структура("Красный,Синий,Зеленый",строц.Красный,строц.Синий,строц.Зеленый);
            ИначеЕсли
рВидИтоговогоЦвета=3 Тогда // нужен 16-ричный
               
Возврат строц.Шестнадцатиричный;
            КонецЕсли;
        КонецЕсли;

    КонецЕсли;

    Возврат Неопределено;
Исключение
   
Сообщить("ПреобразоватьЦвет, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
    Возврат Неопределено;
КонецПопытки;
КонецФункции

Саму таблицу легко найти на сайтах наподобие http://www.cloford.com/resources/colours/500col.htm, скопировать и вставить в обычный моксель. Я, увы, закрыл страницу, откуда брал свою табличку, а повторно не нашёл... Кстати, по ссылке больше, чем у меня, но тамошнюю надо слегка причесать под вышеприведённое считывание.

Всё крайне кондово, но может пригодиться. Единственно, учитывайте, что лучше 1 раз прочитать таблицу соответствий и далее по ней искать. Ну и проиндексируйте по нужной колонке, исходя из ситуации.

Тестировалось на 8.2.17

 

 

 

цвет преобразование RGB colour

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

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

6000 руб.

16.01.2015    61697    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54312    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16623    21    4    

35

Новогоднее оформление для 1С

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

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

27.12.2023    10560    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9484    150    acces969    31    

115

Модель состояния для MVC

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

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

1 стартмани

05.07.2022    3577    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12009    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4706 23.09.13 12:07 Сейчас в теме
Да, и ещё: для RGB коды можно использовать как числа, а можно как строки - смотрите сами, как кому удобнее.
2. ITEkb 15.01.14 08:15 Сейчас в теме
Вот за код в описании огромное спасибо!
Часто приходится сначала скачать, а потом уже смотреть, что внутри.
miavolas; dmpas; +2 Ответить
3. Yimaida 37 19.11.14 16:18 Сейчас в теме
Уважаемый автор, поменяйте в обработке кусок кода:

Попытка стро.Красный=Число(СокрЛП(мргб.Получить(0))) Исключение КонецПопытки;
Попытка стро.Синий=Число(СокрЛП(мргб.Получить(2))) Исключение КонецПопытки;
Попытка стро.Зеленый=Число(СокрЛП(мргб.Получить(1))) Исключение КонецПопытки;

у Вас перепутаны G и B составляющие цвета.

И еще, нет в макете цвета Зеленовато-лимонный (Lime), а может и еще каких.

А так поставил +, т.к. до этого не заморачивался работой с цветами, а тут вдруг пришлось. Идея делать через макет мне нравится, т.к. это самый правильный (на мой взгляд) способ получения значений из предопределенной таблицы. Только вот мне не понятно зачем было раскладывать строковое представление RGB, может их проще было бы в отдельных колонках хранить (и потом быстрее получать).
4. Yashazz 4706 19.11.14 17:13 Сейчас в теме
(3) Yimaida, ага, докопипастился я... Спасибо за поправку, отредактирую. Что касается раскладывания - честно, просто стрельнуло в одно место так сделать.

Недостающие цвета, подозреваю, появились не сразу, хотя может и я чего упустил.
5. dj_serega 390 13.03.15 11:58 Сейчас в теме
имхо, код страшный :( Не хочется даже читать что бы разобраться как работает.
Jonovich; Ivon; +2 Ответить
6. Ivon 673 15.03.16 11:50 Сейчас в теме
(5) dj_serega, У него во всех обработках такой код.
7. Yashazz 4706 27.04.16 15:43 Сейчас в теме
(6) Ivon, и это целенаправленно. Я всегда отличу свой код от чужого. Считайте это вариантом обфускации для защиты интеллектуального права)))
Ну и потом, так компактнее, а мониторы, знаете ли, не у всех 30-ти дюймовые.
9. Jonovich 25 01.11.16 23:10 Сейчас в теме
(5) dj_serega, Полностью согласен с тобой, вникать в решение смысла нет. Автор сего безобразия предлагает бредовую идею по причине:
1. Делать запись файла на диск, а затем читать и парсить файл... и все это только ради того, чтобы узнать RGB составляющие web-цвета... кошмарно и неоправданно, но если это не аргумент, то
2. Алгоритм не будет корректно работать для web-цветов, на то и придумали web-цвета чтобы определять их по идентификатору, а не составляющим RGB. При конвертации в HTML табличного документа с цветом WebЦвета.СветлоРозовый. в HTML получим tr.R0 td.R0C0{ background-color: LightPink; и в этом случае получим ошибку

Считаю более оптимальным решением брать цвета из заранее подготовленного макета. Также оптимально будет на основе его данных построить соответствие всех цветов, и при необходимости обращаться к нему по ключу. Выкладываю такой макет, со всеми цветами используемыми в 1С. Такой табличный документ получить труда не составит, если кому интересно:
1. Забиваем в табло "ЦветаСтиля", "WebЦвета" и "WindowsЦвета", останавливаемся на точке останова, выводим содержимое табло в табличный документ и сохраняем.
2. В цикле назначаем цвет фона ячеек строк табличного документа по указанным в строках именам цветов и сохраняем в *.xls
3. В EXCEL нехитрыми функциями VBA получаем значение и составляющие RGB цвета фона ячейки в строках листа.
Прикрепленные файлы:
Цвета 1С.mxl
10. Yashazz 4706 26.11.17 23:28 Сейчас в теме
(9) Ну, всё ж таки отвечу. Во-первых, уважаемый, вы невнимательно читали. Автор сего безобразия, если говорить о сохранении на диск, цитирует чужую идею и приводит ссылку на неё, прям там в комментарии, а в остальном аналогично Вам работает с табличным документом из макета. Невнимательно читаете, батенька. Во-вторых, если что не менее бредовое, так это предложенное использование экселя - это ограничивает нас виндой и установленным офисом, нуждой мочь запускать ком и в нём гонять vba-скрипты.
8. sound 535 12.09.16 13:00 Сейчас в теме
Пригодилось, спасибо. Какая-то у 1С дурка, на старых версиях платформы можно было в диалоге выбора цвета выбрать как Web цвет, так и абсолютный, сейчас только Web, нафига так сделано непонятно. Вернее понятно, что они все к вебу стремятся, но зачем для толстого клиента закрыли возможность выбора абсолютного цвета непонятно.
11. Yashazz 4706 27.11.17 22:41 Сейчас в теме
Кстати, немного в продолжение темы, раз уж наткнулся.

Преобразование из RGB в 16-ричный:
// строим представление в html
Попытка
	фд=Новый ФорматированныйДокумент;
	тфд=фд.Добавить("Текст",Тип("ТекстФорматированногоДокумента"));
	тфд.ЦветТекста=рЦветРГБ;
	хтмл="";
	фд.ПолучитьHTML(хтмл,Новый Структура);
Исключение
	Сообщить("Ошибка при построении служебного форматированного документа: "+ОписаниеОшибки(),СтатусСообщения.Важное);
	Продолжить;
КонецПопытки;				
// распознаём его и получаем цвет
Попытка
	рЧтение=Новый ЧтениеHTML;
	рЧтение.УстановитьСтроку(хтмл);
	пострДом=Новый ПостроительDOM;
	докДом=пострДом.Прочитать(рЧтение);
	знчАтрибута=докДом.Тело.ДочерниеУзлы[1].ПервыйДочерний.Атрибуты[0].Значение;
	рЦвет16ричный=СокрЛП(СтрЗаменить(СтрЗаменить(знчАтрибута,"color: ",""),";",""));
Исключение
	Сообщить("Ошибка при распознании содержания форматированного документа: "+ОписаниеОшибки(),СтатусСообщения.Важное);
	Продолжить;
КонецПопытки;
Показать


и преобразование из 16-ричного в RGB, соответственно,
рЦвет16ричный="#536ac2";
хтмл="<HTML><HEAD><META content=""text/html; charset=utf-8"" http-equiv=Content-Type><META name=GENERATOR content=""MSHTML 11.00.9600.18817""></HEAD>
|<BODY><P><FONT color="+рЦвет16ричный+">Текст<FONT</P></BODY></HTML>";
фд=Новый ФорматированныйДокумент;
фд.УстановитьHTML(хтмл,Новый Структура);
рЦветРГБ=фд.Элементы[0].Элементы[0].ЦветТекста;


Ну и в принципе, ясно дело, можно просто циклами от 0 до 255 нагенерить все 16-ричные по возрастанию, выполняя простой пересчёт между системами счисления)
12. qazaas 15.08.18 09:36 Сейчас в теме
НЕ РАБОТАЕТ!!
Проверял на платформе 8.3.11.2924, как на управляемых, так и на обычных формах.
Будьте добры, исправьте.
Оставьте свое сообщение