Как программно изменить цвет ячейки в табличной части управляемой формы 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе с обычных форм на управляемые многие разработчики сталкиваются с трудностью: старый и привычный метод перебора строк в цикле для установки цвета ячейки через свойство Оформление больше не работает. В управляемом приложении 1С реализовано четкое разделение данных и их визуального представления. Давайте детально разберем, как правильно реализовать закрашивание ячеек табличной части при выполнении определенных условий, используя механизмы платформы 8.3.

Почему старый подход с циклом не работает?

Проанализируем типичную ошибку начинающего разработчика. В обычных формах мы могли обратиться к свойству ОформлениеСтроки в обработчике ПриВыводеСтроки. В управляемых формах объект ДанныеФормыСтруктура (который представляет собой строку таблицы на клиенте) просто не содержит свойств, отвечающих за визуализацию. Платформа 1С оптимизирована для работы через интернет, поэтому она сначала передает данные, а затем клиентское приложение самостоятельно отрисовывает их на основе заранее заданных правил. Попытка написать код:


Для Каждого Стр Из Объект.ТЧ_Табель Цикл
    Если Стр.Утро_ПН = 1 Тогда
        Стр.Утро.Оформление.ЦветФона = Новый Цвет(255,0,0);
    КонецЕсли;
КонецЦикла;

вызовет ошибку, так как у объекта Стр.Утро нет свойства Оформление. Решением в данной ситуации является использование механизма Условного оформления.

Метод 1: Использование скрытого реквизита и Условного оформления

Рассмотрим самый надежный и производительный способ. Суть его заключается в создании вспомогательного реквизита (флага), который будет хранить состояние строки, а платформа на основе этого состояния сама «раскрасит» нужные ячейки.

Разберем по шагам реализацию этого метода:

  1. Создание признака: Добавим в табличную часть документа реквизит, например, ЦветСтатус (тип Число). Если вы не хотите менять структуру таблиц в базе данных, можно добавить этот реквизит не в объект метаданных, а непосредственно в Реквизиты формы в расширение соответствующей таблицы. Это позволит избежать появления «звездочки» (признака модифицированности) у документа только из-за изменения цвета.
  2. Заполнение признака: В коде, который срабатывает при нажатии кнопки или при изменении данных, мы запускаем цикл и устанавливаем значение этого признака.

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

Метод 2: Программное создание Условного оформления

Если критерии закрашивания или сами цвета заранее неизвестны и могут меняться, рассмотрим, как настроить Условное оформление программно. Это часто требуется в сложных отчетах или динамических формах. Выясним, как это сделать в процедуре ПриСозданииНаСервере.


&НаСервере
Процедура НастроитьУсловноеОформление()
    // Очистим старые правила, если это необходимо
    // УсловноеОформление.Элементы.Очистить();

    ЭлементУО = УсловноеОформление.Элементы.Добавить();
    
    // 1. Что оформляем (Цвет фона)
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ОсобыйТекстНизкийПриоритет);
    
    // 2. Условие (Когда ЦветСтатус = 1)
    ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ_Табель.ЦветСтатус");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = 1;
    
    // 3. Какие поля закрашиваем
    ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТЧ_ТабельФамилия");
КонецПроцедуры

Преимущество этого метода в том, что платформа отрисовывает цвета крайне быстро, даже если в таблице тысячи строк, так как это происходит на уровне движка интерфейса, а не в коде на языке 1С. Для этой задачи можно использовать конструктор кода условного оформления для табличных частей документов.

Важные нюансы и рекомендации

Проанализируем несколько технических моментов, которые помогут сделать решение профессиональным:

1. Выбор цвета. Старайтесь не использовать жестко заданные значения типа Новый Цвет(255, 0, 0). В современных версиях 1С (интерфейс «Такси») пользователи могут переключаться на темную тему или изменять системные масштабы. Рекомендуется использовать системные цвета: ЦветаСтиля.ПоясняющийТекст, ЦветаСтиля.ФонВыделения и т.д. Это обеспечит корректную читаемость текста при любых настройках системы.

2. Обновление интерфейса. Иногда после программного изменения данных в цикле (например, в колонке ЦветСтатус), форма не сразу «подхватывает» изменения в оформлении. В таких случаях можно вызвать метод ЭтаФорма.ОбновитьОтображениеДанных(). Посмотрим на пример вызова:


&НаКлиенте
Процедура КомандаОбработатьТабель(Команда)
    ОбработатьДанныеНаСервере(); // Тут меняем значения признаков
    ОбновитьОтображениеДанных(); // Принудительно перерисовываем форму
КонецПроцедуры

Однако помните, что ОбновитьОтображениеДанных() — ресурсоемкая операция, не вызывайте ее внутри циклов.

3. Оформление всей строки. Если ваша задача — выделить строку целиком (например, сотрудника, у которого есть ошибки в заполнении), просто не добавляйте элементы в коллекцию ЭлементУО.Поля. Если список оформляемых полей пуст, правило автоматически применяется ко всей строке таблицы.

Подводя итог, можно сказать: забудьте о прямом управлении оформлением в циклах для Управляемых форм. Используйте Условное оформление, опираясь на скрытые или расчетные реквизиты данных. Это сделает ваш код чище, а работу интерфейса — быстрее.

← На главную