В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача визуального выделения данных в табличных частях. Условное оформление позволяет изменять цвет текста, фона, шрифты и другие параметры отображения ячеек или целых строк в зависимости от определенных условий. Рассмотрим подробно, как реализовать это программно, разберем типичные ошибки и изучим нюансы, которые помогут сделать интерфейс приложения более отзывчивым и понятным для пользователя. Для решения подобных задач есть инструментарий визуализации статусов и блокировки реквизитов.
Программная работа с оформлением в управляемых формах строится вокруг коллекции УсловноеОформление. Эта коллекция доступна непосредственно в модуле формы. Каждый элемент этой коллекции состоит из трех основных частей:
Проанализируем базовый пример кода, который часто используют разработчики, и выясним, почему он может не работать с первого раза.
Представим ситуацию: нам нужно окрасить строки в табличной части в красный цвет, если дата в строке меньше или равна текущей дате — для этого есть обработка для раскраски строк по статусам. Рассмотрим правильный алгоритм действий в процедуре ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Создаем новый элемент оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 2. Указываем, какие поля будем оформлять
// Если нужно оформить всю строку, добавляем саму таблицу
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТабличнаяЧасть1");
ПолеОформления.Использование = Истина;
// 3. Настраиваем условие (отбор)
// Важно: в ЛевоеЗначение указываем ПУТЬ К ДАННЫМ
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТабличнаяЧасть1.Дата");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
// Особенности работы с датами: использование НачалоДня позволяет избежать проблем с секундами
ЭлементОтбора.ПравоеЗначение = НачалоДня(ТекущаяДата());
ЭлементОтбора.Использование = Истина;
// 4. Устанавливаем визуальные параметры
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
КонецПроцедуры
Разберем важный нюанс: почему в исходном обсуждении код "не работал"? Проблема часто кроется в точности сравнения дат. Если в данных дата хранится как "01.01.2023 00:00:00", а ТекущаяДата() возвращает "01.01.2023 14:30:15", то условие "Больше или равно" может отработать не так, как ожидает разработчик. Использование функции НачалоДня() помогает стандартизировать сравнение.
Существует разница между тем, что мы пишем в Поле оформления и в Отбор. Рассмотрим подробнее:
Товары, а колонка — ТоварыЦена, то для окрашивания только одной ячейки цены нужно написать Новый ПолеКомпоновкиДанных("ТоварыЦена").Объект.ИмяТабличнойЧасти.ИмяРеквизита.Если мы забудем добавить поля оформления вовсе, платформа применит правило ко всей строке таблицы, что часто является желаемым поведением по умолчанию.
Посмотрим на ситуацию, когда оформление добавляется не только при создании формы, но и динамически. Процедура ПриСозданииНаСервере выполняется один раз, но если вы выносите код оформления в отдельную экспортную процедуру, которую вызываете повторно, важно помнить о дублировании.
Выясним, как избежать замусоривания коллекции УсловноеОформление. Перед добавлением новых правил рекомендуется очищать старые, если они не были заданы в визуальном редакторе:
// Очистка всех программных настроек перед добавлением новых
УсловноеОформление.Элементы.Очистить();
Также проанализируем приоритет. Элементы оформления применяются сверху вниз по списку. Если одна и та же ячейка попадает под два разных правила (например, "Сумма > 1000 — Желтый" и "Сумма > 5000 — Красный"), то применяться будет то правило, которое находится ниже в списке. Поэтому более "жесткие" или приоритетные условия следует добавлять в коллекцию последними.
Помимо изменения цвета фона (ЦветФона), программный интерфейс позволяет управлять множеством других параметров. Рассмотрим наиболее полезные из них:
Шрифт = Новый Шрифт(,,Истина)). Это помогает акцентировать внимание на итоговых строках.Пример установки жирного шрифта для определенных строк:
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина));
Важно различать условное оформление формы и условное оформление динамического списка. Хотя программный интерфейс работы с ними почти идентичен, механизмы исполнения различаются.
Для табличных частей (реквизитов объекта) оформление обрабатывается на клиенте. Однако настройка самих правил требует серверного контекста. Поэтому старайтесь настраивать оформление один раз при открытии формы. Если условие оформления зависит от значения в той же строке, платформа сама пересчитает цвет ячейки при изменении данных пользователем без лишнего обращения к серверу.
В случае с Динамическим списком (например, в списках документов или справочников), оформление лучше настраивать через свойство Список.УсловноеОформление. Это позволяет платформе оптимизировать SQL-запросы и подготавливать данные для отображения более эффективно. Для наглядного представления данных подойдёт графическая индикация состояний документов в списках.
Чтобы ваш код был читаемым и его было легко поддерживать, следуйте этим советам:
Цвет, Шрифт).НачалоДня() или КонецДня() избавляет от логических ошибок.УстановитьУсловноеОформлениеНаСервере().Таким образом, программное управление условным оформлением — это мощный инструмент, который при правильном подходе позволяет создавать профессиональные и удобные интерфейсы, помогая пользователю моментально ориентироваться в больших объемах данных.