В платформе 1С:Предприятие объект WebЦвета представляет собой статический набор свойств. Это означает, что мы можем обратиться к конкретному цвету по имени, например, WebЦвета.Аквамарин или WebЦвета.Белый, но мы не можем перебрать их в цикле Для Каждого, так как WebЦвета не являются коллекцией (массивом или соответствием). Однако в реальной практике часто возникает задача динамического выбора цвета, формирования палитры для пользователя или случайной раскраски ячеек отчета. Рассмотрим подробнее несколько эффективных способов решения этой задачи.
Если нашей задачей является получение набора гармоничных цветов, которые гарантированно корректно отображаются в браузерах и на различных мониторах, мы можем воспользоваться алгоритмом генерации так называемых "безопасных" цветов. Эти цвета формируются путем комбинирования значений каналов Red, Green и Blue с шагом 51 (всего 6 вариантов для каждого канала: 0, 51, 102, 153, 204, 255).
Проанализируем программную реализацию этого метода. Мы создадим вложенные циклы для каждого цветового канала, что позволит нам получить 216 уникальных комбинаций:
СписокWebЦветов = Новый СписокЗначений;
Для R = 0 По 5 Цикл
Для G = 0 По 5 Цикл
Для B = 0 По 5 Цикл
// Значение 51 получается делением 255 на 5 промежутков
НовыйЦвет = Новый Цвет(R * 51, G * 51, B * 51);
СписокWebЦветов.Добавить(НовыйЦвет);
КонецЦикла;
КонецЦикла;
КонецЦикла;
// Теперь мы можем использовать этот список для вывода пользователю
Для Каждого ЭлементСписка Из СписокWebЦветов Цикл
Сообщить("Сгенерирован цвет: " + ЭлементСписка.Значение);
КонецЦикла;
Преимущество данного метода заключается в его чистоте — нам не нужно хранить списки имен или использовать скрытые макеты. Однако стоит учитывать, что полученные цвета не будут иметь "красивых" названий, таких как "Небесно-голубой", а будут представлены только своими RGB-составляющими.
Этот способ является наиболее интересным с технической точки зрения. Выясним причину, по которой он работает: в 1С любой объект типа Цвет можно сериализовать во внутреннюю строку. Для системных Web-цветов платформа использует специфический идентификатор (GUID) 71e32f7a-0d04-11d4-8025-0050046f419d и порядковый номер цвета в системном реестре.
Разберем по шагам, как программно "вытащить" все 141 стандартный цвет платформы, не зная их имен:
Функция ПолучитьВсеWebЦвета() Экспорт
МассивЦветов = Новый Массив;
// Шаблон внутренней строки для Web-цвета
// { "#", 71e32f7a-0d04-11d4-8025-0050046f419d, 1, НомерЦвета }
Шаблон = " {""#"",71e32f7a-0d04-11d4-8025-0050046f419d, 1, %Номер%}";
Для Индекс = 0 По 140 Цикл
СтрокаВнутр = СтрЗаменить(Шаблон, "%Номер%", Формат(Индекс, "ЧГ=0"));
Попытка
ТекЦвет = ЗначениеИзСтрокиВнутр(СтрокаВнутр);
МассивЦветов.Добавить(ТекЦвет);
Исключение
// Если индекс выходит за пределы, прерываем цикл
Прервать;
КонецПопытки;
КонецЦикла;
Возврат МассивЦветов;
КонецФункции
Важный момент: использование метода ЗначениеИзСтрокиВнутр относится к недокументированным возможностям. Тем не менее, это самый быстрый способ получить именно те объекты Цвет, которые заложены в платформу 1С изначально.
Если нам важны именно названия цветов (например, для отображения в выпадающем списке), мы можем один раз подготовить текстовую строку со всеми именами и обращаться к коллекции WebЦвета по имени через квадратные скобки. Посмотрим на пример реализации функции получения случайного цвета из стандартного набора:
Функция ПолучитьСлучайныйWebЦвет()
ГСЧ = Новый ГенераторСлучайныхЧисел;
// Список имен цветов, разделенных вертикальной чертой
ТекстЦветов = "Аквамарин|АнтикБелый|Бежевый|Белоснежный|Белый|Бирюзовый|БледноЗеленый|Васильковый|Желтый|Зеленый|Красный|Синий";
// ... здесь может быть полный список из 141 названия
МассивИмен = СтрРазделить(ТекстЦветов, "|");
СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0, МассивИмен.Количество() - 1);
ИмяЦвета = МассивИмен[СлучайныйИндекс];
Возврат WebЦвета[ИмяЦвета];
КонецФункции
Этот метод наиболее надежен для долгосрочной поддержки кода, так как он не зависит от внутреннего устройства платформы и легко читается другими разработчиками.
Рассмотрим ситуацию, когда программисту сложно составить текстовый список имен вручную. В этом случае можно воспользоваться визуальным подходом:
ЦветЯчейки = Макет.Область(Ряд, Колонка).ЦветФона;Этот способ часто критикуют за избыточность метаданных, но он удобен, если вам нужно дать пользователю возможность самому определять доступную палитру, просто редактируя макет в конфигураторе без изменения программного кода.
Проанализируем еще несколько аспектов, которые помогут сделать работу с цветами более профессиональной:
1. Использование Элементов стиля. Если задача состоит в том, чтобы соблюсти корпоративный стиль (например, цвет выделения отрицательных чисел), правильнее не искать "похожий" Web-цвет, а создать Элемент стиля в дереве метаданных. Тогда при смене дизайна всей системы вам достаточно будет изменить цвет в одном месте (в свойствах элемента стиля), и он обновится во всех формах и отчетах автоматически.
2. Web-цвета и мобильная платформа. Обратите внимание, что при разработке под мобильные устройства (Android/iOS) рендеринг некоторых специфических цветов может отличаться. Для мобильных приложений рекомендуется использовать либо базовые цвета (Red, Blue, Green, White, Black), либо задавать их через явные RGB-координаты для обеспечения кроссплатформенного единообразия.
3. Сериализация через XDTO. Выясним интересную особенность: если вам нужно передать выбранный Web-цвет во внешнюю систему (например, в JSON-ответе веб-сервиса), используйте СериализаторXDTO. Он преобразует русскоязычное название 1С в международный стандарт (например, "AliceBlue"), который поймет любой современный браузер или мобильное приложение.
Таким образом, выбор метода зависит от конкретной цели: для генерации широкой палитры подойдет математический цикл, для получения полного системного списка — манипуляция с внутренней строкой, а для удобного выбора пользователем — предопределенный массив имен.