При разработке интерфейсов на платформе «1С:Предприятие 8.3» часто возникает задача индивидуальной визуализации элементов справочника. Например, нужно выделить цветом разные категории товаров, статусы заказов или бригады исполнителей. Сложность заключается в том, что тип данных Цвет является объектом оформления и не может быть напрямую назначен реквизиту справочника в конфигураторе. В этой статье мы подробно разберем, как правильно организовать хранение цвета в базе данных и его корректное отображение в управляемых формах.
Рассмотрим несколько вариантов решения задачи. Традиционный путь с использованием типа ХранилищеЗначения не всегда удобен, так как такие данные сложно извлекать в динамических списках без дополнительной нагрузки на сервер. Оптимальным и наиболее гибким способом является использование строкового реквизита, в который мы будем записывать сериализованное представление объекта Цвет.
Для реализации этого метода выполним следующие шаги в конфигураторе:
ЦветXML с типом Строка (длина 1000, переменная).Цвет с типом Произвольный (он будет служить «оберткой» для выбора цвета пользователем).Разберем программный код, который обеспечит преобразование цвета из строки XML в объект при открытии и обратно при записи. Проанализируем использование системного объекта СериализаторXDTO, который идеально подходит для этой задачи.
В модуле формы элемента пропишем следующие процедуры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Извлекаем цвет из строкового реквизита объекта
Если ПустаяСтрока(Объект.ЦветXML) Тогда
Цвет = Новый Цвет; // Если пусто, используем авто-цвет
Иначе
// Преобразуем строку XML обратно в объект типа Цвет
Цвет = СериализаторXDTO.XMLЗначение(Тип("Цвет"), Объект.ЦветXML);
КонецЕсли;
КонецПроцедура
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Сохраняем выбранный в форме цвет в строковый реквизит объекта
ТекущийОбъект.ЦветXML = СериализаторXDTO.XMLСтрока(Цвет);
КонецПроцедура
Теперь добавим интерфейсную часть. Чтобы пользователь мог выбрать цвет, выведем на форму кнопку или поле, связанное с командой выбора. Выясним, как использовать системный ДиалогВыбораЦвета:
&НаКлиенте
Процедура ИзменитьЦвет(Команда)
Оповещение = Новый ОписаниеОповещения("ИзменитьЦветЗавершение", ЭтотОбъект);
Диалог = Новый ДиалогВыбораЦвета;
Диалог.Показать(Оповещение);
КонецПроцедура
&НаКлиенте
Процедура ИзменитьЦветЗавершение(ВыбранныйЦвет, Параметры) Экспорт
Если ВыбранныйЦвет <> Неопределено Тогда
Цвет = ВыбранныйЦвет;
ОбновитьОтображениеЦвета();
ЭтаФорма.Модифицированность = Истина;
КонецЕсли;
КонецПроцедура
&НаКлиенте
Процедура ОбновитьОтображениеЦвета()
// Устанавливаем фон для нужного элемента формы, например, для Наименования
Элементы.Наименование.ЦветФона = Цвет;
КонецПроцедура
Важный нюанс: В некоторых случаях цвет фона для системных полей (например, Код) может не отображаться. Проанализируем причину: это часто связано со свойством «Отображение предупреждения при редактировании». Чтобы цвет применился, установите это свойство в значение «Не отображать» в конфигураторе.
Отображение цвета в списке — более сложная задача с точки зрения производительности. Рассмотрим два подхода: через «Условное оформление» и через событие ПриПолученииДанныхНаСервере.
Этот способ хорош тем, что выполняется платформенными механизмами. Мы создаем правила оформления для каждого уникального цвета, существующего в справочнике. Посмотрим на реализацию в модуле формы списка:
&НаСервере
Процедура УстановитьОформлениеСписка()
Список.УсловноеОформление.Элементы.Очистить();
// Получаем список всех уникальных цветов из справочника
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ ЦветXML ИЗ Справочник.Бригады ГДЕ НЕ ПометкаУдаления И ЦветXML <> """"");
Выборка = Запрос.Выполнить().Выбрать();
ПолеОформления = Новый ПолеКомпоновкиДанных("Наименование");
Пока Выборка.Следующий() Цикл
Элемент = Список.УсловноеОформление.Элементы.Добавить();
// Превращаем XML обратно в Цвет
ТекЦвет = СериализаторXDTO.XMLЗначение(Тип("Цвет"), Выборка.ЦветXML);
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ТекЦвет);
// Условие: раскрашивать только те строки, где ЦветXML совпадает
Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЦветXML");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = Выборка.ЦветXML;
Отбор.Использование = Истина;
Элемент.Поля.Элементы.Добавить().Поле = ПолеОформления;
Элемент.Использование = Истина;
КонецЦикла;
КонецПроцедура
Если справочник большой, создание сотен правил условного оформления замедлит работу. Проанализируем альтернативу — использование события ПриПолученииДанныхНаСервере. Этот метод работает порционно, оформляя только те строки, которые в данный момент видит пользователь.
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого КлючИЗначение Из Строки Цикл
ДанныеСтроки = КлючИЗначение.Значение;
// КлючИЗначение.Ключ — это ссылка на элемент
// Извлекаем ЦветXML напрямую из данных строки (он должен быть в колонках списка)
ЦветXML = ДанныеСтроки.Данные.ЦветXML;
Если НЕ ПустаяСтрока(ЦветXML) Тогда
ТекЦвет = СериализаторXDTO.XMLЗначение(Тип("Цвет"), ЦветXML);
// Раскрашиваем конкретную ячейку "Наименование"
ОформлениеЯчейки = ДанныеСтроки.Оформление["Наименование"];
ОформлениеЯчейки.УстановитьЗначениеПараметра("ЦветФона", ТекЦвет);
КонецЕсли;
КонецЦикла;
КонецПроцедура
При реализации данного функционала следует учитывать несколько технических тонкостей:
Цвет в 1С может хранить как фиксированные RGB-значения, так и ссылки на системные цвета ОС (например, «Цвет фона окна»). Если пользователь выберет системный цвет, на другом компьютере с иной темой оформления элемент может выглядеть по-другому. Для единообразия рекомендуется приводить выбранный цвет к абсолютному формату.ЦветТекста в белый, в противном случае — в черный.Таким образом, мы разобрали полный цикл работы с цветом в реквизитах справочника: от хранения в базе данных в виде XML-строки до различных методов визуализации в интерфейсе управляемых форм. Выбор между условным оформлением и событием получения данных зависит от объема данных и требований к производительности вашего решения. Для готовой визуализации элементов в типовых конфигурациях без доработки метаданных можно использовать решение для оформления ссылочных объектов в списках и отчетах.