Как получить список или массив Web-цветов в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие объект WebЦвета представляет собой статический набор свойств. Это означает, что мы можем обратиться к конкретному цвету по имени, например, WebЦвета.Аквамарин или WebЦвета.Белый, но мы не можем перебрать их в цикле Для Каждого, так как WebЦвета не являются коллекцией (массивом или соответствием). Однако в реальной практике часто возникает задача динамического выбора цвета, формирования палитры для пользователя или случайной раскраски ячеек отчета. Рассмотрим подробнее несколько эффективных способов решения этой задачи.

Способ 1: Использование математического алгоритма "Безопасных цветов"

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

Способ 2: Перебор через внутреннее представление (Low-level хак)

Этот способ является наиболее интересным с технической точки зрения. Выясним причину, по которой он работает: в 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С изначально.

Способ 3: Создание справочного списка имен в коде

Если нам важны именно названия цветов (например, для отображения в выпадающем списке), мы можем один раз подготовить текстовую строку со всеми именами и обращаться к коллекции WebЦвета по имени через квадратные скобки. Посмотрим на пример реализации функции получения случайного цвета из стандартного набора:


Функция ПолучитьСлучайныйWebЦвет()
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    
    // Список имен цветов, разделенных вертикальной чертой
    ТекстЦветов = "Аквамарин|АнтикБелый|Бежевый|Белоснежный|Белый|Бирюзовый|БледноЗеленый|Васильковый|Желтый|Зеленый|Красный|Синий"; 
    // ... здесь может быть полный список из 141 названия
    
    МассивИмен = СтрРазделить(ТекстЦветов, "|");
    СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0, МассивИмен.Количество() - 1);
    ИмяЦвета = МассивИмен[СлучайныйИндекс];
    
    Возврат WebЦвета[ИмяЦвета];
КонецФункции

Этот метод наиболее надежен для долгосрочной поддержки кода, так как он не зависит от внутреннего устройства платформы и легко читается другими разработчиками.

Способ 4: Использование макетов табличных документов

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

  1. Создадим в конфигурации Общий макет с типом "Табличный документ".
  2. В режиме "1С:Предприятие" откроем любую форму, где есть возможность выбора цвета (например, свойства ячейки в отчете).
  3. Перенесем список цветов в макет, раскрасив соответствующие ячейки.
  4. В коде будем обращаться к макету: ЦветЯчейки = Макет.Область(Ряд, Колонка).ЦветФона;

Этот способ часто критикуют за избыточность метаданных, но он удобен, если вам нужно дать пользователю возможность самому определять доступную палитру, просто редактируя макет в конфигураторе без изменения программного кода.

Дополнительные рекомендации и нюансы

Проанализируем еще несколько аспектов, которые помогут сделать работу с цветами более профессиональной:

1. Использование Элементов стиля. Если задача состоит в том, чтобы соблюсти корпоративный стиль (например, цвет выделения отрицательных чисел), правильнее не искать "похожий" Web-цвет, а создать Элемент стиля в дереве метаданных. Тогда при смене дизайна всей системы вам достаточно будет изменить цвет в одном месте (в свойствах элемента стиля), и он обновится во всех формах и отчетах автоматически.

2. Web-цвета и мобильная платформа. Обратите внимание, что при разработке под мобильные устройства (Android/iOS) рендеринг некоторых специфических цветов может отличаться. Для мобильных приложений рекомендуется использовать либо базовые цвета (Red, Blue, Green, White, Black), либо задавать их через явные RGB-координаты для обеспечения кроссплатформенного единообразия.

3. Сериализация через XDTO. Выясним интересную особенность: если вам нужно передать выбранный Web-цвет во внешнюю систему (например, в JSON-ответе веб-сервиса), используйте СериализаторXDTO. Он преобразует русскоязычное название 1С в международный стандарт (например, "AliceBlue"), который поймет любой современный браузер или мобильное приложение.

Таким образом, выбор метода зависит от конкретной цели: для генерации широкой палитры подойдет математический цикл, для получения полного системного списка — манипуляция с внутренней строкой, а для удобного выбора пользователем — предопределенный массив имен.

← На главную