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

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

При разработке управляемых форм в 1С 8.3 часто возникает задача динамического формирования таблиц и их визуального оформления. Например, когда Таблица Значений создается программно и выводится на форму с помощью вызова ЗначениеВРеквизитФормы(ТЗ, "ДанныеФайла"), стандартные механизмы настройки оформления в конфигураторе недоступны. В этом случае необходимо настроить выделение строк цветом с помощью программного кода.

Рассмотрим подробно, как правильно реализовать эту задачу, каких ошибок следует избегать и как работает механизм условного оформления управляемых форм.

Частая ошибка: попытка обхода строк таблицы в цикле

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


// Неправильный подход!
Для каждого Стр из ЭтаФорма.ДанныеФайла Цикл
    Если СокрЛП(Стр.Склад) <> "Количество" Тогда
        // Создание элемента УО внутри цикла приводит к ошибкам и падению производительности
    КонецЕсли;
КонецЦикла;

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

Пошаговый алгоритм программной настройки условного оформления

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

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

Пример программного кода

Посмотрим на практическую реализацию. Допустим, нам необходимо покрасить в зеленый цвет все строки таблицы ДанныеФайла, у которых в колонке Склад значение не равно "Количество" и "Цена".


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

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

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

// 4. Указываем оформляемые поля (чтобы выделилась конкретная колонка или вся строка)
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДанныеФайлаСклад");
ОформляемоеПоле.Использование = Истина;

Как выделит всю строку целиком, а не одну ячейку?

Обратите внимание на работу с коллекцией Поля у элемента условного оформления:

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

Если в коллекцию Поля добавлена только одна колонка (например, ДанныеФайла.Склад), то цвет изменится только у ячеек этой конкретной колонки.

Чтобы закрасить всю строку целиком, необходимо в цикле добавить в коллекцию Поля все созданные колонки таблицы формы:


Для Каждого Колонка Из Элементы.ТаблицаДанныеФайла.ПодчиненныеЭлементы Цикл
    Если ТипЗнч(Колонка) = Тип("ПолеФормы") Тогда
        ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Колонка.Имя);
        ОформляемоеПоле.Использование = Истина;
    КонецЕсли;
КонецЦикла;

Важные технические нюансы

Выясним частые причины, по которым условное оформление может не срабатывать:

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

Использование описанного подхода позволяет гибко управлять отображением динамических таблиц в управляемых формах 1С 8.3 без потери производительности платформы.

← На главную