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

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

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

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

Разбор типичной ошибки при именовании полей

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

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

Если же мы хотим обратиться к данным через путь к данным, важно помнить: в условном оформлении формы мы указываем именно имена элементов (колонок), а не путь к реквизиту. Посмотрим на исправленный вариант формирования поля:


// Неправильно:
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Корзина.Остаток");

// Правильно (указываем имя колонки таблицы):
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КорзинаОстаток"); 

Как оформить всю строку целиком

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

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


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

Правильная реализация процедуры оформления на сервере

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


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

КонецПроцедуры

Особенности работы с Динамическими списками

Рассмотрим ситуацию, когда ваша таблица является не просто ТаблицейЗначений в данных формы, а ДинамическимСписком. Проанализируем различия:

  1. Для обычной таблицы оформление живет в ЭтаФорма.УсловноеОформление.
  2. Для динамического списка оформление должно настраиваться в КомпоновщикНастроек самого списка.

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


Элемент = Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
// Далее настройка аналогична, но поля указываются как имена полей запроса списка

Дополнительные рекомендации по производительности

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

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

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

← На главную