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

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

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

Почему не работают привычные методы из обычных форм?

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

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

Способ 1: Настройка условного оформления через конструктор

Рассмотрим пошагово, как настроить визуальное отображение строк без написания кода, используя только визуальные средства платформы 1С.

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

Способ 2: Программное управление оформлением

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

Посмотрим на пример кода, который динамически создает правило оформления для таблицы:


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

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

Использование служебных реквизитов для сложных условий

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

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

  1. Добавим в набор записей (на уровне реквизитов формы) дополнительную колонку, например, ИндексЦвета (тип Число) или ТребуетВнимания (тип Булево).
  2. В процедуре, которая заполняет или обновляет данные набора на форме, выполним все сложные расчеты и заполним нашу служебную колонку.
  3. В Условном оформлении настроим простое правило: если ТребуетВнимания равно Истина, то красим строку в красный цвет.

Это значительно повышает производительность, так как сложные вычисления выполняются один раз при загрузке, а платформа лишь проверяет готовое значение флага.

Особенности обновления оформления для Наборов Записей

В отличие от динамического списка, РегистрСведенийНаборЗаписей — это данные, находящиеся в оперативной памяти (в контексте формы). Это дает важное преимущество: условное оформление срабатывает мгновенно. Как только пользователь меняет значение в ячейке, которая участвует в условии оформления, цвет строки меняется сразу, не дожидаясь записи объекта в базу данных. Это позволяет создавать интерактивные интерфейсы, которые реагируют на действия пользователя "на лету".

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

Таким образом, мы выяснили, что отсутствие события ПриВыводеСтроки в управляемых формах — это не ограничение, а переход к более декларативному и производительному методу настройки интерфейса через УсловноеОформление. Используйте его возможности для создания удобных и функциональных форм для ваших пользователей.

← На главную