Как сохранить и отобразить цвет в реквизите справочника 1С:Предприятие 8.3

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

При разработке интерфейсов на платформе «1С:Предприятие 8.3» часто возникает задача индивидуальной визуализации элементов справочника. Например, нужно выделить цветом разные категории товаров, статусы заказов или бригады исполнителей. Сложность заключается в том, что тип данных Цвет является объектом оформления и не может быть напрямую назначен реквизиту справочника в конфигураторе. В этой статье мы подробно разберем, как правильно организовать хранение цвета в базе данных и его корректное отображение в управляемых формах.

Выбор стратегии хранения данных

Рассмотрим несколько вариантов решения задачи. Традиционный путь с использованием типа ХранилищеЗначения не всегда удобен, так как такие данные сложно извлекать в динамических списках без дополнительной нагрузки на сервер. Оптимальным и наиболее гибким способом является использование строкового реквизита, в который мы будем записывать сериализованное представление объекта Цвет.

Для реализации этого метода выполним следующие шаги в конфигураторе:

  1. Добавим в справочник реквизит ЦветXML с типом Строка (длина 1000, переменная).
  2. На форме элемента создадим реквизит формы Цвет с типом Произвольный (он будет служить «оберткой» для выбора цвета пользователем).

Реализация логики в форме элемента

Разберем программный код, который обеспечит преобразование цвета из строки XML в объект при открытии и обратно при записи. Проанализируем использование системного объекта СериализаторXDTO, который идеально подходит для этой задачи.

В модуле формы элемента пропишем следующие процедуры:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Извлекаем цвет из строкового реквизита объекта
    Если ПустаяСтрока(Объект.ЦветXML) Тогда
        Цвет = Новый Цвет; // Если пусто, используем авто-цвет
    Иначе
        // Преобразуем строку XML обратно в объект типа Цвет
        Цвет = СериализаторXDTO.XMLЗначение(Тип("Цвет"), Объект.ЦветXML);
    КонецЕсли;
КонецПроцедура

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    // Сохраняем выбранный в форме цвет в строковый реквизит объекта
    ТекущийОбъект.ЦветXML = СериализаторXDTO.XMLСтрока(Цвет);
КонецПроцедура

Теперь добавим интерфейсную часть. Чтобы пользователь мог выбрать цвет, выведем на форму кнопку или поле, связанное с командой выбора. Выясним, как использовать системный ДиалогВыбораЦвета:


&НаКлиенте
Процедура ИзменитьЦвет(Команда)
    Оповещение = Новый ОписаниеОповещения("ИзменитьЦветЗавершение", ЭтотОбъект);
    Диалог = Новый ДиалогВыбораЦвета;
    Диалог.Показать(Оповещение);
КонецПроцедура

&НаКлиенте
Процедура ИзменитьЦветЗавершение(ВыбранныйЦвет, Параметры) Экспорт
    Если ВыбранныйЦвет <> Неопределено Тогда
        Цвет = ВыбранныйЦвет;
        ОбновитьОтображениеЦвета();
        ЭтаФорма.Модифицированность = Истина;
    КонецЕсли;
КонецПроцедура

&НаКлиенте
Процедура ОбновитьОтображениеЦвета()
    // Устанавливаем фон для нужного элемента формы, например, для Наименования
    Элементы.Наименование.ЦветФона = Цвет;
КонецПроцедура

Важный нюанс: В некоторых случаях цвет фона для системных полей (например, Код) может не отображаться. Проанализируем причину: это часто связано со свойством «Отображение предупреждения при редактировании». Чтобы цвет применился, установите это свойство в значение «Не отображать» в конфигураторе.

Отображение цвета в динамическом списке

Отображение цвета в списке — более сложная задача с точки зрения производительности. Рассмотрим два подхода: через «Условное оформление» и через событие ПриПолученииДанныхНаСервере.

Метод 1: Динамическое условное оформление

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


&НаСервере
Процедура УстановитьОформлениеСписка()
    Список.УсловноеОформление.Элементы.Очистить();
    
    // Получаем список всех уникальных цветов из справочника
    Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ ЦветXML ИЗ Справочник.Бригады ГДЕ НЕ ПометкаУдаления И ЦветXML <> """"");
    Выборка = Запрос.Выполнить().Выбрать();
    
    ПолеОформления = Новый ПолеКомпоновкиДанных("Наименование");

    Пока Выборка.Следующий() Цикл
        Элемент = Список.УсловноеОформление.Элементы.Добавить();
        
        // Превращаем XML обратно в Цвет
        ТекЦвет = СериализаторXDTO.XMLЗначение(Тип("Цвет"), Выборка.ЦветXML);
        
        Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ТекЦвет);
        
        // Условие: раскрашивать только те строки, где ЦветXML совпадает
        Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЦветXML");
        Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        Отбор.ПравоеЗначение = Выборка.ЦветXML;
        Отбор.Использование = Истина;
        
        Элемент.Поля.Элементы.Добавить().Поле = ПолеОформления;
        Элемент.Использование = Истина;
    КонецЦикла;
КонецПроцедура

Метод 2: Событие ПриПолученииДанныхНаСервере (рекомендуется)

Если справочник большой, создание сотен правил условного оформления замедлит работу. Проанализируем альтернативу — использование события ПриПолученииДанныхНаСервере. Этот метод работает порционно, оформляя только те строки, которые в данный момент видит пользователь.


&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    Для Каждого КлючИЗначение Из Строки Цикл
        ДанныеСтроки = КлючИЗначение.Значение;
        // КлючИЗначение.Ключ — это ссылка на элемент
        // Извлекаем ЦветXML напрямую из данных строки (он должен быть в колонках списка)
        ЦветXML = ДанныеСтроки.Данные.ЦветXML;
        
        Если НЕ ПустаяСтрока(ЦветXML) Тогда
            ТекЦвет = СериализаторXDTO.XMLЗначение(Тип("Цвет"), ЦветXML);
            
            // Раскрашиваем конкретную ячейку "Наименование"
            ОформлениеЯчейки = ДанныеСтроки.Оформление["Наименование"];
            ОформлениеЯчейки.УстановитьЗначениеПараметра("ЦветФона", ТекЦвет);
        КонецЕсли;
    КонецЦикла;
КонецПроцедура

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

При реализации данного функционала следует учитывать несколько технических тонкостей:

  1. Абсолютные vs Системные цвета: Объект Цвет в 1С может хранить как фиксированные RGB-значения, так и ссылки на системные цвета ОС (например, «Цвет фона окна»). Если пользователь выберет системный цвет, на другом компьютере с иной темой оформления элемент может выглядеть по-другому. Для единообразия рекомендуется приводить выбранный цвет к абсолютному формату.
  2. Контрастность текста: При выборе темного фона текст может стать нечитаемым. Мы можем программно рассчитывать яркость цвета. Если она ниже определенного порога, устанавливайте ЦветТекста в белый, в противном случае — в черный.
  3. Интеграция: Использование сериализации XDTO делает ваши данные совместимыми с Web-клиентом и упрощает передачу информации о цвете через HTTP-сервисы или JSON (строку XML легко передать и обработать).

Таким образом, мы разобрали полный цикл работы с цветом в реквизитах справочника: от хранения в базе данных в виде XML-строки до различных методов визуализации в интерфейсе управляемых форм. Выбор между условным оформлением и событием получения данных зависит от объема данных и требований к производительности вашего решения. Для готовой визуализации элементов в типовых конфигурациях без доработки метаданных можно использовать решение для оформления ссылочных объектов в списках и отчетах.

← На главную