Преобразование цветов без таблиц сопоставления
Преобразование цветов разных видов только средствами 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-ричные значения в коде обрабатываются как строки, без хеш-метки "#". В комментариях к коду даны указания об альтернативных способах решения в рамках платформы.

