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

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

В процессе работы с документами (например, при проведении инвентаризации в отраслевых конфигурациях) часто требуется визуально выделить проблемные позиции. Типичная задача: сравнить учетную цену номенклатуры с ценой последнего поступления и, если отклонение превышает 20%, подсветить строку или конкретную ячейку красным цветом. Разберем по шагам, как правильно реализовать такое поведение в управляемом интерфейсе 1С:Предприятия.

Особенности работы с оформлением в управляемых формах

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

Проанализируем ключевое ограничение платформы: механизм отбора условного оформления не умеет производить математические вычисления "на лету" (нельзя напрямую написать условие вида Цена > ЗакупочнаяЦена * 1.2). В отборе допускается сравнение поля либо со статическим значением, либо напрямую с другим полем компоновки данных. Именно поэтому для подсветки строк по сложной формуле нам обязательно понадобится вспомогательное поле в строке таблицы — флаг расхождения (Булево) или рассчитанная величина отклонения (Число).

Шаг 1. Создание вспомогательной колонки

Рассмотрим два варианта добавления расчетной колонки в документ:

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

Шаг 2. Расчет данных и заполнение отклонений

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


&НаСервере
Процедура ПроверитьЦеныНаСервере()
    
    // Получаем цены последнего поступления одним запросом
    // и заполняем вспомогательную колонку в цикле
    Для Каждого Стр Из Объект.Товары Цикл
        // Пример упрощенного расчета процента отклонения
        Если Стр.ЦенаЗакупа <> 0 Тогда
            Стр.РазностьЦен = ((Стр.Цена - Стр.ЦенаЗакупа) / Стр.ЦенаЗакупа) * 100;
        Иначе
            Стр.РазностьЦен = 0;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

После заполнения колонки в данных формы платформа автоматически применит настроенное условное оформление ко всем строкам, удовлетворяющим условию.

Шаг 3. Интерактивная настройка условного оформления

Если структура таблицы зафиксирована в конфигураторе, настроить раскраску удобнее всего визуально без написания кода:

  1. Открываем форму документа в конфигураторе и переходим в свойства самой формы.
  2. Находим свойство Условное оформление и нажимаем кнопку открытия.
  3. Добавляем новый элемент оформления.
  4. На вкладке Оформление отмечаем параметр ЦветТекста или ЦветФона и выбираем нужный цвет (например, красный).
  5. На вкладке Условие добавляем отбор: левое поле — Объект.Товары.РазностьЦен, вид сравнения — Больше, правое значение — 20.
  6. На вкладке Оформляемые поля указываем колонку или группу колонок, которые требуется подсветить (например, ТоварыЦена или всю таблицу Товары, если нужно залить строку целиком).

Шаг 4. Программная настройка условного оформления

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


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

Обратите внимание на критически важное отличие: в свойстве ЛевоеЗначение отбора указывается путь к данным через точку (Объект.Товары.РазностьЦен), а в коллекции Поля.Элементы передается имя элемента формы (колонки ТоварыЦена или таблицы Товары).

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

Если оформление настроено (в конфигураторе или кодом), значения в колонке есть, но строки упорно не подкрашиваются, проанализируем частые скрытые ошибки:

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

Альтернативные способы информирования

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


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Цена отклоняется более чем на 20% от последнего закупа!";
Сообщение.Поле = "Объект.Товары[" + Формат(ИндексСтроки, "ЧГ=0") + "].Цена";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();

При переходе по такому сообщению в панели ошибок платформа 1С автоматически активизирует и отобразит на экране нужную ячейку табличной части.

← На главную