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

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

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

Разберем типичную проблему обращения к полям

Часто начинающие разработчики пытаются создать элемент условного оформления, допуская ошибку в адресации полей. Проанализируем ситуацию: если мы хотим подсветить строку табличной части на основании её номера или значения в колонке, недостаточно просто указать имя этой колонки в конструкторе ПолеКомпоновкиДанных. Давайте посмотрим на пример ошибочного кода, который часто встречается на практике:


ЭлементОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НомерСтроки"); // Ошибка!

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

Пошаговое создание программного условного оформления

Рассмотрим по шагам процесс создания правила, которое будет окрашивать строку в желтый цвет при совпадении номера строки с заданным параметром. Проанализируем итоговый корректный алгоритм:

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

Посмотрим на рабочий пример кода, который решает задачу:


&НаСервере
Процедура ИзменитьЦвет(Номер)   
    // Очищаем старые правила, чтобы не плодить дубли при каждом вызове
    УсловноеОформление.Элементы.Очистить();
    
    // Добавляем новое правило оформления
    ЦветОформление = УсловноеОформление.Элементы.Добавить();   
    
    // Устанавливаем, что именно меняем - в данном случае ЦветФона
    ЦветОформление.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Желтый);
    
    // Настраиваем отбор (условие)
    ЭлементОформления = ЦветОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));   
    // ВАЖНО: Указываем полный путь "ИмяТаблицы.ИмяРеквизита"
    ЭлементОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПроизвольныеСтроки.НомерСтроки");
    ЭлементОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОформления.ПравоеЗначение = Номер;   
    ЭлементОформления.Использование = Истина; 
    
    // Указываем, какие поля на форме нужно раскрасить
    ПолеЭлемента = ЦветОформление.Поля.Элементы.Добавить();
    ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ПроизвольныеСтрокиЗначение");   
    
    // Принудительно обновляем отображение (не всегда обязательно, но полезно)
    Элементы.ПроизвольныеСтроки.Обновить();
КонецПроцедуры

Проанализируем критические моменты и рекомендации

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

2. Использование "НомерСтроки" в условиях. Использовать стандартный реквизит НомерСтроки для раскраски — не самая надежная практика. Выясним причину: при сортировке или удалении строк номера могут пересчитываться. **Лучшая практика:** используйте уникальный идентификатор строки или ключевое поле данных для установки отбора.

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

4. Приоритетность правил. Если вы добавляете несколько правил программно, имейте в виду, что платформа применяет их сверху вниз. Если для анализа текущего состояния элементов формы вам не хватает стандартных средств отладки, можно задействовать редактор форм в режиме предприятия, чтобы проверить свойства и иерархию элементов в реальном времени — для этого подойдет комплект инструментов разработчика с редактором объектов.

Таким образом, мы видим, что программное управление оформлением в 1С 8.3 — мощный инструмент, требующий понимания механизмов компоновки данных. Поскольку работа с объектами оформления напрямую может быть громоздкой, для сложных случаев целесообразно использовать вспомогательные инструменты, такие как СКДБилдер для упрощения создания объектов СКД. Используйте полные пути к реквизитам через точку и старайтесь минимизировать количество серверных вызовов для изменения структуры оформления, отдавая предпочтение изменению самих данных.

← На главную