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