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

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

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

Способ 1. Изменение цвета области макета перед выводом

Самый распространенный и очевидный подход — получить область строки из макета, заполнить её параметры, при выполнении условия ошибки изменить свойство ЦветФона и вывести строку в результирующий табличный документ.

Проанализируем важнейший нюанс этого способа. Метод ПолучитьОбласть() возвращает объект типа ОбластьЯчеекТабличногоДокумента. Если в целях оптимизации мы получаем область макета один раз до начала цикла выборки данных, то назначение цвета для ошибочной строки изменит саму область в памяти платформы. В результате все последующие строки выборки будут выводиться с тем же цветом фона. Чтобы избежать этой ошибки, необходимо либо получать область из макета заново на каждой итерации, либо явно сбрасывать цвет фона для корректных строк.

Рассмотрим пример кода с явным возвратом цвета по умолчанию:


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

Пока Выборка.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    
    Если Выборка.СрокОкончанияДействия < ТекущаяДата() Тогда
        // Подсвечиваем просроченную строку
        ОбластьСтрока.ЦветФона = WebЦвета.СветлоРозовый;
    Иначе
        // Обязательно возвращаем стандартный цвет, если область не переполучается
        ОбластьСтрока.ЦветФона = WebЦвета.Авто;
    КонецЕсли;
    
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Способ 2. Раскрашивание строк в уже сформированном табличном документе

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

Разберем по шагам, как получить координаты только что выведенной строки:

  1. Перед вызовом метода Вывести() фиксируем текущую высоту таблицы с помощью свойства ВысотаТаблицы. Номер первой выводимой строки будет равен ТабДок.ВысотаТаблицы + 1.
  2. Выводим область в документ через ТабДок.Вывести(ОбластьСтрока);.
  3. Фиксируем конечную строку вывода, которая теперь совпадает со значением ТабДок.ВысотаТаблицы.
  4. Получаем результирующую область через метод Область() табличного документа и устанавливаем требуемый цвет фона.

Посмотрим на пример практической реализации:


НомерПервойСтроки = ТабДок.ВысотаТаблицы + 1;
ТабДок.Вывести(ОбластьСтрока);
НомерПоследнейСтроки = ТабДок.ВысотаТаблицы;

Если Выборка.ЕстьОшибка Тогда
    // Получаем диапазон строк от первой до последней по всей ширине документа
    ОбластьРезультата = ТабДок.Область(НомерПервойСтроки, 1, НомерПоследнейСтроки, ТабДок.ШиринаТаблицы);
    ОбластьРезультата.ЦветФона = WebЦвета.Персиковый;
КонецЕсли;

Также для обращения к целой строке можно использовать адресацию в формате R1C1:


Если Выборка.ЕстьОшибка Тогда
    ИмяСтроки = "R" + Формат(НомерПервойСтроки, "ЧГ=0");
    ТабДок.Область(ИмяСтроки).ЦветФона = WebЦвета.СветлоРозовый;
КонецЕсли;

Способ 3. Использование двух именованных областей в макете

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

  1. В макете создаем стандартную область строки с именем Строка.
  2. Рядом создаем точную копию этой области с именем СтрокаОшибка и настраиваем для неё нужный фон, рамки или цвет текста прямо в палитре свойств ячеек макета.
  3. В коде вывода переопределяем имя получаемой области в зависимости от условий проверки.

Рассмотрим пример реализации такого переключения:


Пока Выборка.Следующий() Цикл
    Если Выборка.СрокОкончанияДействия < ТекущаяДата() Тогда
        ОбластьВывода = Макет.ПолучитьОбласть("СтрокаОшибка");
    Иначе
        ОбластьВывода = Макет.ПолучитьОбласть("Строка");
    КонецЕсли;
    
    ОбластьВывода.Параметры.Заполнить(Выборка);
    ТабДок.Вывести(ОбластьВывода);
КонецЦикла;

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

Рекомендации по выбору цветов и вариантов оформления

Выясним, как сделать отчет не только функциональным, но и визуально приятным:

  1. Выбор источника цвета: Вместо жесткого задания RGB-компонент через конструктор Новый Цвет(R, G, B) рекомендуется использовать палитру WebЦвета (например, WebЦвета.СветлоРозовый) или цвета из метаданных конфигурации через коллекцию ЦветаСтиля. Использование цветов стиля позволяет печатным формам корректно адаптироваться под различные темы оформления интерфейса «1С:Предприятия».
  2. Альтернативное оформление: У объекта ОбластьЯчеекТабличногоДокумента помимо ЦветФона доступны свойства ЦветТекста, Шрифт, а также метод ОбвестиГраницу(). Иногда для выделения проблемы достаточно выделить текст полужирным начертанием или обвести ячейку рамкой, не перегружая отчет сплошной заливкой.
  3. Отчеты на СКД: Если отчет строится с использованием Системы компоновки данных, раскрашивать строки вручную в коде не требуется. Для этого используется стандартный механизм «Условное оформление», настраиваемый как в схеме компоновки, так и программно через коллекцию КомпоновщикНастроек.Настройки.УсловноеОформление.
← На главную