Переход с обычных форм (1С 8.1) на управляемые формы (1С 8.3) часто вызывает вопросы у разработчиков, привыкших к событиям ПриВыводеСтроки или ПриПолученииДанных. В новом интерфейсе «Такси» идеология изменилась: вместо прямого управления каждой строкой в момент отрисовки используется механизм Условного оформления. Рассмотрим подробнее, как реализовать задачу раскраски строк табличной части, чтобы сделать работу пользователя более наглядной и эффективной.
В старых версиях платформы мы писали код внутри события табличного поля. Это позволяло гибко управлять цветом, но создавало нагрузку на систему, так как код выполнялся постоянно при прокрутке списка. В управляемых формах УсловноеОформление — это декларативный механизм. Мы один раз описываем правило (что красим, при каком условии и в какой цвет), а платформа сама оптимизирует процесс отображения. Проанализируем два основных способа настройки: интерактивный и программный.
Если условие раскраски статично и не требует сложных вычислений, это самый простой и правильный путь. К слову, добавление реквизитов и элементов формы на управляемые формы возможно и без кодирования. Разберем по шагам:
ЦветФона или ЦветТекста.Объект.Товары.Количество > 100).Важный нюанс: Помните, что приоритет правил в списке идет сверху вниз. Нижние правила перекрывают верхние, если их условия пересекаются.
Часто условия зависят от бизнес-логики, которую нельзя жестко задать в конфигураторе. В этом случае мы будем использовать программный код. Выясним причину, почему это лучше делать в процедуре ПриСозданииНаСервере: именно на этом этапе формируется структура формы, и мы можем единожды задать правила оформления.
Рассмотрим пример кода, который раскрашивает строки в зависимости от значения перечисления:
&НаСервере
Процедура УстановитьРаскраскуСтрок()
// Очищаем старые правила, чтобы избежать дублирования
УсловноеОформление.Элементы.Очистить();
// Создаем новый элемент оформления
ЭлементУО = УсловноеОформление.Элементы.Добавить();
// 1. Устанавливаем, ЧТО именно меняем (Цвет фона)
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(204, 255, 204)); // Светло-зеленый
// 2. Устанавливаем УСЛОВИЕ
ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ВариантОбеспечения");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = Перечисления.ВариантыОбеспечения.Отгрузить;
ЭлементУсловия.Использование = Истина;
// 3. Указываем ПОЛЯ, которые нужно покрасить
// Если нужно покрасить все колонки, пройдемся циклом по элементам формы
Для каждого Стр Из Элементы.Товары.ПодчиненныеЭлементы Цикл
ПолеОформления = ЭлементУО.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Стр.Имя);
ПолеОформления.Использование = Истина;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию, когда табличная часть содержит иерархию (группы колонок). Обычный перебор подчиненных элементов не подкрасит колонки внутри групп. Чтобы решение было универсальным, необходимо добавить проверку типа элемента. Посмотрим на доработанный цикл:
Для каждого Стр Из Элементы.Товары.ПодчиненныеЭлементы Цикл
Если Стр.Вид = ВидГруппыФормы.ГруппаКолонок Тогда
// Если это группа, заходим внутрь и добавляем вложенные элементы
Для каждого ВложенныйЭлемент Из Стр.ПодчиненныеЭлементы Цикл
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ВложенныйЭлемент.Имя);
КонецЦикла;
Иначе
// Если обычная колонка — добавляем сразу
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Стр.Имя);
КонецЕсли;
КонецЦикла;
Вернемся к вопросу автора: как раскрасить строки с одинаковой датой? Стандартное УсловноеОформление сравнивает поле строки с константой или другим полем этой же строки. Оно не может «заглянуть» в соседнюю строку.
Решение задачи:
ДублирующаясяДата с типом Булево). Сделайте его невидимым на форме.Истина в этот скрытый реквизит.УсловноеОформление, где условием будет Объект.Товары.ДублирующаясяДата = Истина. Похожий прием используется, когда нужно реализовать флажок в динамическом списке.Разберем несколько важных моментов, которые помогут избежать ошибок при разработке:
1. Конфликт имен переменных. В коде процедур не рекомендуется называть локальную переменную словом УсловноеОформление, так как это имя уже зарезервировано за свойством формы. Лучше использовать префиксы, например, ЭлементУО или МоеОформление.
2. Очистка правил. Если вы вызываете программную установку оформления несколько раз (например, при изменении каких-то параметров на форме), обязательно используйте метод УсловноеОформление.Элементы.Очистить(). Если этого не делать, количество правил в коллекции будет расти бесконечно, что приведет к «тормозам» интерфейса.
3. Цвет текста vs Цвет фона. Часто при раскраске фона пользователь теряет выделенную строку (цвет фона перекрывает системную подсветку). В таких случаях рекомендуем использовать ЦветТекста или устанавливать ЦветФона в очень бледные тона, чтобы системное выделение оставалось заметным.
4. Имена полей. При добавлении поля в ЭлементУО.Поля.Элементы.Добавить() в конструктор ПолеКомпоновкиДанных нужно передавать именно Имя элемента формы (колонки), а не имя реквизита из объекта. Это частая причина, почему оформление «не взлетает».
Используя эти методы, мы можем создавать интуитивно понятные интерфейсы, которые помогают пользователю мгновенно ориентироваться в больших объемах данных. Условное оформление — мощный инструмент, требующий аккуратного подхода к производительности и структуре данных.