При разработке конфигураций на платформе 1С часто возникает задача визуального выделения важных данных. Например, в библиотечной системе крайне полезно сразу видеть статус книги: выделять статус «Выдана» тревожным красным цветом, статус «Возвращена» — спокойным зеленым, а статус «Утеряна» — предупреждающим оранжевым. Сам объект метаданных Перечисление не хранит информацию о цветах интерфейса, так как его задача — хранить жестко заданный список значений в базе данных. Всю логику визуального оформления необходимо реализовывать непосредственно на уровне отображения: в формах списков, формах документов или отчетах. Разберем подробно, как решить эту задачу для различных типов форм и архитектурных сценариев.
В современных конфигурациях 1С, работающих на управляемом интерфейсе (управляемые формы), основным инструментом визуализации является механизм Условного оформления. Его можно настроить без написания кода непосредственно в конфигураторе.
Проанализируем пошагово процесс интерактивной настройки условного оформления:
Цвет текста или Цвет фона, и установим желаемый цвет (например, красный для статуса «Выдана»).Объект.Книги.Статус или ДинамическийСписок.Статус). В колонке «Вид сравнения» укажем Равно. В колонке «Правое значение» выберем конкретное значение перечисления — Перечисление.СтатусыКниг.Выдана.Статус. Если нужно покрасить всю строку, добавим все поля этой таблицы.Визуальная настройка удобна, но программное создание правил условного оформления в процедуре ПриСозданииНаСервере предпочтительнее для профессиональной разработки. Это делает форму более переносимой, код — легко читаемым, а логику раскраски — динамической.
Рассмотрим пример кода, реализующий раскраску строк динамического списка или табличной части:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Оформление для статуса "Выдана" (Красный цвет)
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Задаем цвет текста
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
// Задаем условие: СтатусКниги = Значение(Перечисление.СтатусыКниг.Выдана)
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.СтатусКниги");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Выдана");
// Указываем оформляемое поле
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("СтатусКниги");
// 2. Оформление для статуса "Возвращена" (Зеленый цвет)
ЭлементОформленияЗеленый = УсловноеОформление.Элементы.Добавить();
ЭлементОформленияЗеленый.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Зеленый);
ЭлементОтбораЗеленый = ЭлементОформленияЗеленый.Отбор.Элементы.Добавить(Tip("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораЗеленый.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.СтатусКниги");
ЭлементОтбораЗеленый.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбораЗеленый.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Возвращена");
ПолеОформленияЗеленый = ЭлементОформленияЗеленый.Поля.Элементы.Добавить();
ПолеОформленияЗеленый.Поле = Новый ПолеКомпоновкиДанных("СтатусКниги");
КонецПроцедуры
Данный подход позволяет гибко управлять оформлением. Мы можем добавлять новые правила или отключать старые в зависимости от прав текущего пользователя или режима работы программы.
В устаревших конфигурациях 1С (обычные формы) интерфейсные механизмы работают иначе. Для раскраски строк табличного поля программисты часто используют событие ПриВыводеСтроки. Однако это событие вызывается при прорисовке каждой отдельной строки на экране, что может приводить к снижению производительности при быстрой прокрутке больших списков.
Выясним причину замедлений и разберем оптимизированный вариант с использованием события ПриПолученииДанных. Данное событие отрабатывает сразу для всей порции отображаемых данных (пакета строк), что существенно сокращает количество обращений к базе данных и ускоряет рендеринг интерфейса.
Посмотрим на пример реализации обработки события ПриПолученииДанных:
Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
// Обходим коллекцию строк, которые платформа подготовила к выводу на экран
Для Каждого СтрокаОформления Из ОформленияСтрок Цикл
ДанныеСтроки = СтрокаОформления.ДанныеСтроки;
Если ДанныеСтроки = Неопределено Тогда
Продолжить;
КонецЕсли;
// Анализируем значение перечисления
Если ДанныеСтроки.Статус = Перечисления.СтатусыКниг.Выдана Тогда
СтрокаОформления.Ячейки.Статус.ЦветТекста = WebЦвета.Красный;
СтрокаОформления.Ячейки.Статус.Шрифт = Новый Шрифт(СтрокаОформления.Ячейки.Статус.Шрифт, , , Истина); // сделаем жирным
ИначеЕсли ДанныеСтроки.Статус = Перечисления.СтатусыКниг.Возвращена Тогда
СтрокаОформления.Ячейки.Статус.ЦветТекста = WebЦвета.Зеленый;
ИначеЕсли ДанныеСтроки.Статус = Перечисления.СтатусыКниг.Утеряна Тогда
СтрокаОформления.Ячейки.Статус.ЦветТекста = WebЦвета.ТемноОранжевый;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Используя этот метод, мы гарантируем плавную работу интерфейса даже в нагруженных табличных частях и динамических списках на обычных формах.
Хорошим тоном в профессиональной разработке является централизация бизнес-логики. Если цвета статусов жестко «зашить» в коде конкретной формы, то при необходимости изменить «красный цвет» на «бордовый» придется вносить изменения во все формы, где выводится этот статус.
Проанализируем архитектурное решение: создадим функцию в неглобальном общем модуле (например, ОформлениеИнтерфейсаКлиентСервер), которая будет возвращать цвет по переданному значению перечисления.
// Функция в общем модуле ОформлениеИнтерфейсаКлиентСервер
// Возвращает объект Цвет в зависимости от переданного статуса книги
Функция ПолучитьЦветСтатусаКниги(ЗначениеСтатуса) Экспорт
Если ЗначениеСтатуса = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Выдана") Тогда
Возврат WebЦвета.Красный;
ИначеЕсли ЗначениеСтатуса = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Возвращена") Тогда
Возврат WebЦвета.Зеленый;
ИначеЕсли ЗначениеСтатуса = ПредопределенноеЗначение("Перечисление.СтатусыКниг.Утеряна") Тогда
Возврат WebЦвета.ТемноОранжевый;
Иначе
Возврат WebЦвета.Черный;
КонецЕсли;
КонецФункции
Теперь в любой управляемой форме при настройке условного оформления программным методом мы можем обратиться к этой функции, что исключает дублирование кода и делает систему простой в сопровождении.
Иногда сплошная заливка цветом или изменение цвета текста перегружает интерфейс, делая его «пестрым». Более современным и эргономичным решением является вывод небольших графических иконок (пиктограмм) рядом с текстовым значением статуса.
Для реализации этого подхода выполним следующие шаги:
ОбщаяКартинка, содержащую набор иконок (например, зеленый кружок, красный кружок, оранжевый треугольник), расположенных в один ряд или столбец одинакового размера (например, 16x16 пикселей).ПутьКДаннымКартинки.Такой подход делает интерфейс лаконичным, аккуратным и понятным пользователю с первого взгляда.
Если бизнес-требования предполагают, что пользователи (например, старший библиотекарь) должны иметь возможность самостоятельно менять цвета отображения статусов без привлечения программиста, использование объекта Перечисление накладывает серьезные ограничения. Конфигурацию придется обновлять каждый раз, когда потребуется добавить новый статус или изменить цветовую гамму.
В этом случае отличной альтернативой перечислению станет использование справочника СтатусыКниг:
СтатусыКниг вместо перечисления.ЦветОформления с типом ХранилищеЗначения (для хранения системного объекта Цвет) или строковый реквизит для HEX-кода цвета (например, «#FF0000»).Подводя итог, можно утверждать, что платформа 1С предоставляет обширный инструментарий для визуального оформления данных. Выбор конкретного метода зависит от архитектуры вашей конфигурации (управляемые или обычные формы), требований к производительности и необходимости динамического администрирования настроек интерфейса пользователями.