Преобразование цветов без таблиц сопоставления. Готовый код

23.05.22

Разработка - Универсальные функции

Преобразование цветов разных видов только средствами 1С, без использования статичных правил сопоставления.

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

Оставим в стороне теорию, что такое объект "Цвет" в 1С и каковы нюансы его хранения, чтения и поведения в коллекциях. Просто замечу, что при решении задачи я использовал только штатные средства платформы, сериализацию и десериализацию, неявные преобразования объектов 1С, и ориентировался как на 8.2, так и на 8.3, причём 8.3 релизов до появления бинарных операций.

Рассматривались web-цвета, windows-цвета, абсолютные цвета - словом, то, что доступно в диалогах выбора цвета в Конфигураторе и Предприятии. Цвета в диалогах формы - всякие, все в кучу; и в зависимости от выбранного, возвращают цвет разного вида (кроме, конечно, авто-цвета).

Коллекция веб-цветов 1С, доступная из системного набора значений WebЦвета, является, по сути, аналогом Extended color keywords (п.4.3 спецификации www.w3.org/TR/2022), которая представляет собой последовательный набор строковых имён цветов в русской и английской нотациях, упорядоченный от 1 до 146 алфавитно по возрастанию английской нотации. Нулевой индекс не используется. Индекс, больший, чем 146, считается преобразователем 1С соответствующим тёмно-бордовому (Maroon, код 84). Эти значения заявлены в фасете перечисления в определении простого типа XS системной xml-схемы пакета  http://v8.1c.ru/8.1/data/ui/colors/web, но они ничего не дают в плане преобразования во что-либо. Это статично заданные цвета.
Принцип, по которому они упорядочены в диалоге выбора цвета, мне понять не удалось.

Аналогично, коллекция цветов из системного набора значений WindowsЦвета, аналогична CSS system colors (п.4.5 той же спецификации). Нулевой индекс не используется. Индекс, больший, чем 28, считается преобразователем 1С соответствующим "Заголовок неактивного окна (градиент средний)". В диалоге выбора упорядочены по возрастанию индексов. Интересно, что в палитре есть два цвета с именем "ГраницаАктивногоОкна" и разными индексами и реальным цветом. Это цвета, зависящие от настройки ОС.

По преобразованию веб-цветов, конечно, можно ещё применить js и функцию getComputedStyle, но это работает не на всех браузерах и может зависеть от версии WebKit. По преобразованию win-цветов можно задействовать WinAPI-функцию GetSysColor.

Цвета как элементы стиля это лишь надстройка, потому самостоятельно не рассматривались. Все объекты метаданных с видом Метаданные.СвойстваОбъектов.ВидЭлементаСтиля.Цвет позволяют получить сам цвет из свойства "Значение", и задача сводится к предыдущей. Единственно, замечу, в нотации ЗначениеВСтрокуВнутр цвета стиля кодируются цифрой 3.

Учитывалось, что цвета разных видов не равны как переменные, несмотря на визуальную аналогичность, ни при каких преобразованиях. Будем говорить о цветах без прозрачности (т.е. без альфа-компоненты RGBA), без HSL/HSLA. Все 16-ричные значения в коде обрабатываются как строки, без хеш-метки "#". В комментариях к коду даны указания об альтернативных способах решения в рамках платформы.

 
 Функции преобразования цветов

 

Ссылки:

Стандарты W3C
//infostart.ru/public/860960/
//infostart.ru/public/1278131/

Ещё интересно было бы попробовать JS-функция преобразования без getComputedStyle

 

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

Проверено на 8.3.6.2237. Для отдельных непонятливых, почему такой релиз, объясню: у многих ещё 8.2, а это стабильный релиз, близкий к 8.2 по своим возможностям. Публикация сделана и маркирована в расчёте и на прежние версии платформы.

Вступайте в нашу телеграмм-группу Инфостарт

Цвет Преобразование цветов Конвертация Сериализация цвета Hex RGB

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

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

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    43885    TitanLuchs    109    

153

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    44775    dsdred    110    

155

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    39137    bayselonarrend    22    

180

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    66900    dimanich70    87    

178

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    35700    SeiOkami    48    

140

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    31434    YA_418728146    8    

176
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 7626 23.05.22 17:27 Сейчас в теме
В статье про краски мало яркости )))
artbear; t278; adhocprog; +3 Ответить
2. Diversus 2340 24.05.22 09:12 Сейчас в теме
Сделал и сопровождаю целую библиотеку для работы с цветом :)
Универсальные функции для работы с цветом в 1С
Там есть в том числе и то, что вы предлагаете. Правда в несколько иной форме.
3. Dimbayyyy 208 24.05.22 09:43 Сейчас в теме
Кто-нибудь извлек хоть какую-то пользу из статьи?
Никакой информативности.
Проверено на 8.3.6.2237.
- найс, это же самая актуальная платформа!
5. Артано 803 23.06.22 14:33 Сейчас в теме
(3)
Кто-нибудь извлек хоть какую-то пользу из статьи?
Никакой информативности.
Проверено на 8.3.6.2237.
- найс, это же самая актуальная платформа!


Когда потребуется поддерживать универсальный инструмент работающий на ряде платформ разной степени замшелости, то поймёте.
В данном случае чем ниже старейшая поддерживаемая версия платформы тем лучше.

P.S. Судя по коду 8.1 должно поддерживаться, вроде тогда появилась явная сериализация через XDTO
unknown181538; Yashazz; +2 Ответить
4. ge_ni 307 30.05.22 12:29 Сейчас в теме
Раньше искал подобное... Яков Коган!!! И Бесплатно!!! Однозначно "+" :)
6. Iotsuba 5 20.07.26 16:28 Сейчас в теме
Спасибо за подборку — трюк с получением hex через сериализацию ФорматированнойСтроки особенно хорош, платформа сама разыменовывает web-цвета. Прогнал функции на 8.3.27, нашлась пара ошибок.

1. Счисления_10_В_16 не дополняет результат до двух разрядов. Для компонент 1–15 возвращается один символ: 8 → "8", 10 → "A". В ПолучитьHexЦветаИзАбсолютного обработан только ноль, поэтому цвет (0, 8, 128) даёт строку "00880" — пять символов вместо "000880". Такой hex сам по себе битый, а обратная ПолучитьАбсолютныйЦветИзHex восстанавливает из него (0, 136, 0). Для байта проще обойтись вообще без цикла:

Функция БайтВHex(Знач Байт)
      Возврат Сред("0123456789ABCDEF", Цел(Байт / 16) + 1, 1)
              + Сред("0123456789ABCDEF", Байт % 16 + 1, 1);
КонецФункции


2. В ПолучитьАбсолютныйЦветИзLong опечатка: деление на 65535 вместо 65536. На белом цвете воспроизводится сразу: 16777215 → синяя компонента получается 0, итог (255, 255, 0) — жёлтый вместо белого. Битыми будут все значения от 16776960 и выше.

рСиний=(Цел(ИсхLong / 65535)) % 256; // так в статье: белый 16777215 дает Синий=0
рСиний=(Цел(ИсхLong / 65536)) % 256; // правильно
7. Yashazz 4932 20.07.26 16:33 Сейчас в теме
(6) Грешен, есть такая фигня. Согласен с правками. То ли у меня сил-времени не было, то ли ещё что... сам наткнулся на вторую ашипку, у себя поправил, тут нет. Спасибо вам!
Для отправки сообщения требуется регистрация/авторизация