Как изменить цвет каждого значения перечисления на форме в 1С

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

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

Способ 1. Условное оформление в управляемых формах (визуальный метод)

В современных конфигурациях 1С, работающих на управляемом интерфейсе (управляемые формы), основным инструментом визуализации является механизм Условного оформления. Его можно настроить без написания кода непосредственно в конфигураторе.

Проанализируем пошагово процесс интерактивной настройки условного оформления:

  1. Откроем нужную управляемую форму в конфигураторе и перейдем на вкладку «Условное оформление» (в окне свойств формы или в нижней части редактора формы).
  2. Нажмем кнопку «Добавить» для создания нового элемента условного оформления.
  3. В появившемся окне перейдем на вкладку «Оформление». Здесь выберем нужное свойство, например, Цвет текста или Цвет фона, и установим желаемый цвет (например, красный для статуса «Выдана»).
  4. Перейдем на вкладку «Условие». Добавим новое условие: в колонке «Левое значение» выберем путь к данным нашего статуса (например, Объект.Книги.Статус или ДинамическийСписок.Статус). В колонке «Вид сравнения» укажем Равно. В колонке «Правое значение» выберем конкретное значение перечисления — Перечисление.СтатусыКниг.Выдана.
  5. Перейдем на вкладку «Оформляемые поля». Укажем поля (колонки таблицы), которые должны окрашиваться при выполнении условия. Если мы хотим выделить только ячейку со статусом, добавим туда поле Статус. Если нужно покрасить всю строку, добавим все поля этой таблицы.
  6. Повторим эти шаги для остальных статусов («Возвращена» — зеленый, «Утеряна» — оранжевый).

Способ 2. Программная настройка условного оформления (управляемые формы)

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

Рассмотрим пример кода, реализующий раскраску строк динамического списка или табличной части:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

КонецПроцедуры

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

Способ 3. Оптимизация раскраски для обычных форм

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

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

Посмотрим на пример реализации обработки события ПриПолученииДанных:


Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)

    // Обходим коллекцию строк, которые платформа подготовила к выводу на экран
    Для Каждого СтрокаОформления Из ОформленияСтрок Цикл
        
        ДанныеСтроки = СтрокаОформления.ДанныеСтроки;
        Если ДанныеСтроки = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        
        // Анализируем значение перечисления
        Если ДанныеСтроки.Статус = Перечисления.СтатусыКниг.Выдана Тогда
            СтрокаОформления.Ячейки.Статус.ЦветТекста = WebЦвета.Красный;
            СтрокаОформления.Ячейки.Статус.Шрифт = Новый Шрифт(СтрокаОформления.Ячейки.Статус.Шрифт, , , Истина); // сделаем жирным
        ИначеЕсли ДанныеСтроки.Статус = Перечисления.СтатусыКниг.Возвращена Тогда
            СтрокаОформления.Ячейки.Статус.ЦветТекста = WebЦвета.Зеленый;
        ИначеЕсли ДанныеСтроки.Статус = Перечисления.СтатусыКниг.Утеряна Тогда
            СтрокаОформления.Ячейки.Статус.ЦветТекста = WebЦвета.ТемноОранжевый;
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

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

Способ 4. Вынос логики оформления в общий модуль

Хорошим тоном в профессиональной разработке является централизация бизнес-логики. Если цвета статусов жестко «зашить» в коде конкретной формы, то при необходимости изменить «красный цвет» на «бордовый» придется вносить изменения во все формы, где выводится этот статус.

Проанализируем архитектурное решение: создадим функцию в неглобальном общем модуле (например, ОформлениеИнтерфейсаКлиентСервер), которая будет возвращать цвет по переданному значению перечисления.


// Функция в общем модуле ОформлениеИнтерфейсаКлиентСервер
// Возвращает объект Цвет в зависимости от переданного статуса книги
Функция ПолучитьЦветСтатусаКниги(ЗначениеСтатуса) Экспорт

    Если ЗначениеСтатуса = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Выдана") Тогда
        Возврат WebЦвета.Красный;
    ИначеЕсли ЗначениеСтатуса = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Возвращена") Тогда
        Возврат WebЦвета.Зеленый;
    ИначеЕсли ЗначениеСтатуса = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Утеряна") Тогда
        Возврат WebЦвета.ТемноОранжевый;
    Иначе
        Возврат WebЦвета.Черный;
    КонецЕсли;

КонецФункции

Теперь в любой управляемой форме при настройке условного оформления программным методом мы можем обратиться к этой функции, что исключает дублирование кода и делает систему простой в сопровождении.

Способ 5. Использование пиктограмм (картинок) вместо текста

Иногда сплошная заливка цветом или изменение цвета текста перегружает интерфейс, делая его «пестрым». Более современным и эргономичным решением является вывод небольших графических иконок (пиктограмм) рядом с текстовым значением статуса.

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

  1. Создадим в конфигураторе новый объект метаданных ОбщаяКартинка, содержащую набор иконок (например, зеленый кружок, красный кружок, оранжевый треугольник), расположенных в один ряд или столбец одинакового размера (например, 16x16 пикселей).
  2. Для элемента табличного поля или колонки динамического списка установим свойство ПутьКДаннымКартинки.
  3. В качестве значения картинки будем передавать индекс пиктограммы в коллекции. Индекс можно рассчитать программно в зависимости от значения перечисления (например, статус «Выдана» — индекс 0, «Возвращена» — индекс 1, «Утеряна» — индекс 2).

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

Способ 6. Динамическая настройка цветов (альтернатива перечислениям)

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

В этом случае отличной альтернативой перечислению станет использование справочника СтатусыКниг:

  1. Создадим справочник СтатусыКниг вместо перечисления.
  2. Добавим в справочник реквизит ЦветОформления с типом ХранилищеЗначения (для хранения системного объекта Цвет) или строковый реквизит для HEX-кода цвета (например, «#FF0000»).
  3. В форме списка или форме выбора справочника предоставим пользователю стандартную палитру выбора цвета.
  4. При выводе данных в списках будем программно считывать цвет из справочника и применять его к оформлению строк. Это полностью освобождает разработчика от рутинной поддержки визуального стиля.

Подводя итог, можно утверждать, что платформа 1С предоставляет обширный инструментарий для визуального оформления данных. Выбор конкретного метода зависит от архитектуры вашей конфигурации (управляемые или обычные формы), требований к производительности и необходимости динамического администрирования настроек интерфейса пользователями.

← На главную