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