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

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

При разработке и доработке документов в управляемом приложении часто возникает задача визуального выделения определенных строк табличной части. Например, в документе «Данные для расчета зарплаты» конфигурации «Зарплата и кадры государственного учреждения» или «Зарплата и управление персоналом» требуется подсветить сотрудников, работающих по подработке или совмещению.

Рассмотрим подробно два основных способа решения этой задачи: программное добавление правила с условием ВСписке и оптимизированный способ с использованием служебного реквизита.

Способ 1. Программная настройка условного оформления с проверкой «ВСписке»

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

Разберем по шагам порядок действий:

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

Посмотрим на пример реализации данного подхода на сервере:


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

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

Ограничения и особенности работы с условием «ВСписке»

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

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

2. Отсутствие динамического обновления: Если список подработчиков изменится в процессе работы пользователя с документом (например, при добавлении новых строк), условие со старым фиксированным списком значений не обновит оформление автоматически — потребуется пересчитывать список и заново программно пересоздавать правила условного оформления.

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

Способ 2. Оптимальное решение через служебный реквизит (Флаг)

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

Проанализируем алгоритм реализации этого метода:

  1. Добавляем в табличную часть формы служебную колонку типа Булево (например, ЭтоПодработка). При необходимости ее можно сделать невидимой для пользователя.
  2. В момент заполнения табличной части или в событии ПриИзменении для колонки Сотрудник рассчитываем признак подработки и записываем результат (Истина или Ложь) в реквизит ЭтоПодработка.
  3. В настройках условного оформления формы (в режиме конфигуратора или программно) задаем простое условие: Объект.Начисления.ЭтоПодработка = Истина.

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


&НаСервере
Процедура ОформитьПодработчиковПоФлагу()

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

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

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

← На главную