При формировании печатных форм и отчетов часто возникает необходимость визуально выделить определенные строки — например, подсветить красным или розовым цветом ошибки, просроченные договоры, отрицательные остатки или незаполненные реквизиты. Разберем основные способы реализации этой задачи в платформе 1С:Предприятие, их преимущества и подводные камни.
Самый распространенный и очевидный подход — получить область строки из макета, заполнить её параметры, при выполнении условия ошибки изменить свойство ЦветФона и вывести строку в результирующий табличный документ.
Проанализируем важнейший нюанс этого способа. Метод ПолучитьОбласть() возвращает объект типа ОбластьЯчеекТабличногоДокумента. Если в целях оптимизации мы получаем область макета один раз до начала цикла выборки данных, то назначение цвета для ошибочной строки изменит саму область в памяти платформы. В результате все последующие строки выборки будут выводиться с тем же цветом фона. Чтобы избежать этой ошибки, необходимо либо получать область из макета заново на каждой итерации, либо явно сбрасывать цвет фона для корректных строк.
Рассмотрим пример кода с явным возвратом цвета по умолчанию:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
Если Выборка.СрокОкончанияДействия < ТекущаяДата() Тогда
// Подсвечиваем просроченную строку
ОбластьСтрока.ЦветФона = WebЦвета.СветлоРозовый;
Иначе
// Обязательно возвращаем стандартный цвет, если область не переполучается
ОбластьСтрока.ЦветФона = WebЦвета.Авто;
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Иногда удобнее сначала вывести область со стандартным оформлением, а затем изменить свойства ячеек непосредственно в результирующем табличном документе. Такой подход полезен, если в строке выводятся вложенные секции или если логика раскрашивания определяется сложными расчетами уже после компоновки строки.
Разберем по шагам, как получить координаты только что выведенной строки:
Вывести() фиксируем текущую высоту таблицы с помощью свойства ВысотаТаблицы. Номер первой выводимой строки будет равен ТабДок.ВысотаТаблицы + 1.ТабДок.Вывести(ОбластьСтрока);.ТабДок.ВысотаТаблицы.Область() табличного документа и устанавливаем требуемый цвет фона.Посмотрим на пример практической реализации:
НомерПервойСтроки = ТабДок.ВысотаТаблицы + 1;
ТабДок.Вывести(ОбластьСтрока);
НомерПоследнейСтроки = ТабДок.ВысотаТаблицы;
Если Выборка.ЕстьОшибка Тогда
// Получаем диапазон строк от первой до последней по всей ширине документа
ОбластьРезультата = ТабДок.Область(НомерПервойСтроки, 1, НомерПоследнейСтроки, ТабДок.ШиринаТаблицы);
ОбластьРезультата.ЦветФона = WebЦвета.Персиковый;
КонецЕсли;
Также для обращения к целой строке можно использовать адресацию в формате R1C1:
Если Выборка.ЕстьОшибка Тогда
ИмяСтроки = "R" + Формат(НомерПервойСтроки, "ЧГ=0");
ТабДок.Область(ИмяСтроки).ЦветФона = WebЦвета.СветлоРозовый;
КонецЕсли;
Если требуется избежать жесткого прописывания цветов в программном коде и передать управление оформлением визуальному редактору макета, применим подход с дублированием строк:
Строка.СтрокаОшибка и настраиваем для неё нужный фон, рамки или цвет текста прямо в палитре свойств ячеек макета.Рассмотрим пример реализации такого переключения:
Пока Выборка.Следующий() Цикл
Если Выборка.СрокОкончанияДействия < ТекущаяДата() Тогда
ОбластьВывода = Макет.ПолучитьОбласть("СтрокаОшибка");
Иначе
ОбластьВывода = Макет.ПолучитьОбласть("Строка");
КонецЕсли;
ОбластьВывода.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьВывода);
КонецЦикла;
Преимущество этого метода: аналитик или разработчик может изменить цветовую гамму печатной формы в макете без вмешательства в алгоритмы модуля.
Выясним, как сделать отчет не только функциональным, но и визуально приятным:
Новый Цвет(R, G, B) рекомендуется использовать палитру WebЦвета (например, WebЦвета.СветлоРозовый) или цвета из метаданных конфигурации через коллекцию ЦветаСтиля. Использование цветов стиля позволяет печатным формам корректно адаптироваться под различные темы оформления интерфейса «1С:Предприятия».ОбластьЯчеекТабличногоДокумента помимо ЦветФона доступны свойства ЦветТекста, Шрифт, а также метод ОбвестиГраницу(). Иногда для выделения проблемы достаточно выделить текст полужирным начертанием или обвести ячейку рамкой, не перегружая отчет сплошной заливкой.КомпоновщикНастроек.Настройки.УсловноеОформление.