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

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

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

Почему свойство ЦветФона не подходит для ячеек

Рассмотрим типичную ситуацию: разработчик пытается обратиться к элементу формы напрямую через коллекцию Элементы и установить ему цвет. Например:

Элементы.ИмяКолонки.ЦветФона = Новый Цвет(255, 0, 0);

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

Единственно верный способ: Условное Оформление

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

Разберем основные составляющие элемента условного оформления:

  1. Оформление: какие именно свойства мы меняем (цвет фона, цвет текста, шрифт, видимость и т.д.).
  2. Условие (Отбор): правило, по которому платформа понимает, к каким именно строкам нужно применить оформление.
  3. Оформляемые поля: список колонок, которые должны изменить свой вид при выполнении условия.

Программное создание Условного Оформления

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

Посмотрим на пример функции, которая добавляет правило оформления:


// Добавляем новый элемент оформления
ЭлементУО = УсловноеОформление.Элементы.Добавить();

// 1. Устанавливаем, что именно менять (Цвет фона)
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);

// 2. Указываем, какие поля оформлять
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТабКолонка_1"); // Имя элемента формы (колонки)
ОформляемоеПоле.Использование = Истина;

// 3. Задаем условие (Отбор)
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Таб.Значение"); // Путь к данным
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.ПравоеЗначение = 100;
ЭлементОтбора.Использование = Истина;

Важное замечание: в свойстве ЛевоеЗначение отбора всегда указывается путь к данным (например, Объект.ИмяТаблицы.ИмяРеквизита), а в ОформляемоеПоле — имя элемента формы (имя колонки). Если эти значения перепутать, оформление не сработает.

Метод «Технического флага» для динамической раскраски

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

Проанализируем правильный алгоритм решения через «техническое поле»:

  1. Добавим в нашу таблицу (в реквизиты табличной части или таблицу значений) скрытый реквизит, например, СтатусЦвета (тип Число).
  2. Настроим Условное Оформление один раз (например, в процедуре ПриСозданииНаСервере). Условие будет звучать так: «Если СтатусЦвета = 1, то Поле_1 — Желтое; если СтатусЦвета = 2, то Поле_1 — Красное».
  3. В событии ПриИзменении на клиенте мы просто меняем значение в колонке СтатусЦвета для текущей строки. Платформа мгновенно увидит изменение данных и сама перекрасит ячейку согласно правилу УО.

Пример реализации в событии ПриИзменении:


&НаКлиенте
Процедура ТабЗначениеПриИзменении(Элемент)
    СтрокаТаблицы = Элементы.Таб.ТекущиеДанные;
    
    // Вместо изменения цвета элемента, меняем данные-признак
    Если СтрокаТаблицы.Значение > 100 Тогда
        СтрокаТаблицы.СтатусЦвета = 1; // УО подхватит это и раскрасит ячейку
    Иначе
        СтрокаТаблицы.СтатусЦвета = 0;
    КонецЕсли;
КонецПроцедуры

Как избежать критических ошибок при программной настройке

Рассмотрим ситуацию, когда УсловноеОформление добавляется в цикле или часто вызываемых процедурах. Выясним, почему это опасно. Каждый вызов УсловноеОформление.Элементы.Добавить() создает новый объект в памяти. Если этот код выполняется при каждом изменении данных, список правил оформления будет бесконечно расти. Это приведет к значительным задержкам при отрисовке формы и «утечке» памяти.

Чтобы избежать проблем, соблюдайте следующие правила:

Особенности для динамических колонок

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

Подведем итог: раскраска в 1С 8.3 — это работа с состоянием данных, а не с визуальными свойствами элементов. Используя Условное Оформление и принцип «технических флагов», вы сможете создавать отзывчивые и красивые интерфейсы, которые будут работать стабильно и быстро.

← На главную