В процессе работы с документами (например, при проведении инвентаризации в отраслевых конфигурациях) часто требуется визуально выделить проблемные позиции. Типичная задача: сравнить учетную цену номенклатуры с ценой последнего поступления и, если отклонение превышает 20%, подсветить строку или конкретную ячейку красным цветом. Разберем по шагам, как правильно реализовать такое поведение в управляемом интерфейсе 1С:Предприятия.
В обычных формах разработчики часто использовали перебор строк таблицы и прямое изменение свойств ячеек в обработчике ПриВыводеСтроки. В управляемом интерфейсе архитектура иная: все визуальные изменения табличных данных выполняются через механизм условного оформления.
Проанализируем ключевое ограничение платформы: механизм отбора условного оформления не умеет производить математические вычисления "на лету" (нельзя напрямую написать условие вида Цена > ЗакупочнаяЦена * 1.2). В отборе допускается сравнение поля либо со статическим значением, либо напрямую с другим полем компоновки данных. Именно поэтому для подсветки строк по сложной формуле нам обязательно понадобится вспомогательное поле в строке таблицы — флаг расхождения (Булево) или рассчитанная величина отклонения (Число).
Рассмотрим два варианта добавления расчетной колонки в документ:
РазностьЦен (тип Число) или признак ЕстьРасхождение (тип Булево). Это самый простой способ, однако он меняет состав реквизитов базы данных.ПриСозданииНаСервере с помощью метода ИзменитьРеквизиты, добавив колонку прямо в путь Объект.Товары. Такие данные будут существовать только в памяти клиентского сеанса.По нажатию кнопки проверки на форме запускаем серверную процедуру. Чтобы форма работала быстро даже при тысячах строк, избегаем запросов в цикле: получаем актуальные цены последнего прихода одним пакетным запросом на сервер (например, срезом последних регистра сведений с отбором по массиву номенклатуры документа). После этого обходим строки и фиксируем результат:
&НаСервере
Процедура ПроверитьЦеныНаСервере()
// Получаем цены последнего поступления одним запросом
// и заполняем вспомогательную колонку в цикле
Для Каждого Стр Из Объект.Товары Цикл
// Пример упрощенного расчета процента отклонения
Если Стр.ЦенаЗакупа <> 0 Тогда
Стр.РазностьЦен = ((Стр.Цена - Стр.ЦенаЗакупа) / Стр.ЦенаЗакупа) * 100;
Иначе
Стр.РазностьЦен = 0;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После заполнения колонки в данных формы платформа автоматически применит настроенное условное оформление ко всем строкам, удовлетворяющим условию.
Если структура таблицы зафиксирована в конфигураторе, настроить раскраску удобнее всего визуально без написания кода:
ЦветТекста или ЦветФона и выбираем нужный цвет (например, красный).Объект.Товары.РазностьЦен, вид сравнения — Больше, правое значение — 20.ТоварыЦена или всю таблицу Товары, если нужно залить строку целиком).Разберем, как сформировать то же самое правило программно. Настраивать коллекцию УсловноеОформление формы следует один раз при ее инициализации — в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура НастроитьОформлениеРасхожденияЦен()
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 1. Устанавливаем оформление (красный цвет фона)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоРозовый);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
// 2. Задаем условие отбора
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.РазностьЦен");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.ПравоеЗначение = 20;
ЭлементОтбора.Использование = Истина;
// 3. Указываем оформляемое поле (имя элемента формы!)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");
КонецПроцедуры
Обратите внимание на критически важное отличие: в свойстве ЛевоеЗначение отбора указывается путь к данным через точку (Объект.Товары.РазностьЦен), а в коллекции Поля.Элементы передается имя элемента формы (колонки ТоварыЦена или таблицы Товары).
Если оформление настроено (в конфигураторе или кодом), значения в колонке есть, но строки упорно не подкрашиваются, проанализируем частые скрытые ошибки:
УсловноеОформление.Элементы.Очистить() при открытии или инициализации формы. Если такая строчка присутствует, она полностью уничтожает как программные, так и интерактивные правила, заданные в свойствах формы.Строка, а в правом значении отбора указано число 20, сравнение вернет ложь. Всегда проверяйте типы реквизитов.ТоварыЦена) передать путь к данным (Объект.Товары.Цена), платформа проигнорирует подсветку ячейки.Если табличная часть содержит сотни строк, пользователь может не заметить подсвеченную красным строку, если она скрыта за пределами видимости экрана. В дополнение к условному оформлению рекомендуется использовать механизм СообщениеПользователю с привязкой к конкретной строке:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Цена отклоняется более чем на 20% от последнего закупа!";
Сообщение.Поле = "Объект.Товары[" + Формат(ИндексСтроки, "ЧГ=0") + "].Цена";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();
При переходе по такому сообщению в панели ошибок платформа 1С автоматически активизирует и отобразит на экране нужную ячейку табличной части.