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