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