При разработке отчетов в 1С часто возникает задача визуального выделения данных: например, подсветить красным критические остатки или выделить зеленым цветом выполненные заказы. В этой статье мы подробно разберем все доступные способы раскраски строк в табличном документе, проанализируем их плюсы и минусы, а также выясним, какой метод лучше использовать в различных ситуациях.
Это один из самых гибких и профессиональных способов. Когда мы вызываем метод Вывести() у объекта ТабличныйДокумент, система не просто копирует данные из макета, но и возвращает нам объект типа ОбластьТабличногоДокумента. Эта область соответствует именно той строке, которую мы только что добавили в отчет.
Рассмотрим ситуацию: нам нужно окрасить всю строку, если остаток товара превышает 10 единиц. Давайте проанализируем следующий код:
// Создаем новый табличный документ и получаем макет
НовТабДок = Новый ТабличныйДокумент;
Макет = Объект.МакетОтчета;
Шапка = Макет.ПолучитьОбласть("Шапка");
НовТабДок.Вывести(Шапка);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем область строки из макета
СтрокаТЧ = Макет.ПолучитьОбласть("СтрокаТЧ");
СтрокаТЧ.Параметры.Заполнить(Выборка);
// Выводим строку и получаем ссылку на выведенную область
ТекущаяСтрока = НовТабДок.Вывести(СтрокаТЧ);
// Проверяем условие и устанавливаем цвет фона для всей выведенной строки
Если Выборка.Остаток > 10 Тогда
ТекущаяСтрока.ЦветФона = WebЦвета.ЖелтоЗеленый;
КонецЕсли;
КонецЦикла;
Преимущество этого метода: нам не нужно знать точные координаты ячеек (строк и колонок). Объект ТекущаяСтрока охватывает ровно те ячейки, которые были определены в области "СтрокаТЧ" макета. Это защищает ваш код от поломок при добавлении новых колонок в макет.
Если по каким-то причинам нам нужно раскрасить не всю выведенную область, а только определенный диапазон колонок внутри строки еще до того, как она попала в итоговый документ, мы можем обратиться к методу Область() самой переменной СтрокаТЧ. Разберем, как это работает на практике.
Важно понимать, что внутри полученной области СтрокаТЧ отсчет координат начинается заново (с первой строки и первой колонки). Поэтому, даже если в основном отчете это 100-я строка, для объекта СтрокаТЧ это будет "R1".
Если ВыборкаДетальныеЗаписи.Остаток > 10 Тогда
// Красим ячейки с 1 по 12 в первой строке полученной области
СтрокаТЧ.Область("R1C1:R1C12").ЦветФона = WebЦвета.ЖелтоЗеленый;
Иначе
// Важно сбросить цвет, если область используется повторно в цикле
СтрокаТЧ.Область("R1C1:R1C12").ЦветФона = WebЦвета.Авто;
КонецЕсли;
Этот метод удобен, когда в макете много колонок, но выделять цветом нужно только смысловую часть (например, только данные о товаре, не затрагивая колонки с примечаниями).
Иногда визуальное оформление строки включает в себя не только цвет фона, но и особые границы, жирный шрифт или специфические цвета текста. В таких случаях проще подготовить в макете две (или более) именованные области. Например, "СтрокаОбычная" и "СтрокаВыделенная".
Выясним, как реализовать логику переключения между ними:
Пока Выборка.Следующий() Цикл
Если Выборка.Остаток > 10 Тогда
ОбластьДляВывода = Макет.ПолучитьОбласть("СтрокаВыделенная");
Иначе
ОбластьДляВывода = Макет.ПолучитьОбласть("СтрокаОбычная");
КонецЕсли;
ОбластьДляВывода.Параметры.Заполнить(Выборка);
НовТабДок.Вывести(ОбластьДляВывода);
КонецЦикла;
Почему это эффективно? Платформе 1С проще вывести готовую отформатированную область, чем программно менять свойства каждой ячейки в цикле. Это существенно ускоряет формирование отчетов с десятками тысяч строк.
Если ваш отчет строится с использованием СКД, то писать код для раскраски строк вообще не требуется. Для этого существует механизм Условного оформления. Проанализируем алгоритм настройки:
Цвет фона.Остаток Больше 10.Совет: В СКД старайтесь использовать "Цвета стиля" вместо конкретных RGB-значений. Например, выбрав ЦветФонаОсобогоТекста, вы гарантируете, что отчет будет выглядеть корректно как в светлой, так и в темной теме оформления интерфейса "Такси".
Помимо свойства ЦветФона, мы можем управлять и другими характеристиками области для достижения лучшего визуального эффекта:
1. Изменение шрифта. Выделение жирным шрифтом часто более информативно, чем заливка цветом. Рассмотрим пример:
ТекущаяСтрока.Шрифт = Новый Шрифт(ТекущаяСтрока.Шрифт, , , Истина); // Устанавливаем жирное начертание
2. Узоры. Если отчет предназначен для печати на черно-белом принтере, цветовое выделение может стать нечитаемым. В этом случае используйте свойство Узор:
ТекущаяСтрока.Узор = ТипУзораТабличногоДокумента.ДиагональнаяСетка;
3. Границы. Для акцентирования внимания на строке можно обвести ее жирной рамкой, используя метод ОбвестиГраницей().
При работе с большими объемами данных (от 50 000 строк и выше) программная раскраска может замедлить работу системы. Проанализируем рекомендации по ускорению:
Цвет или Шрифт внутри цикла. Создайте их один раз перед началом цикла и присваивайте готовую переменную.Таким образом, выбор метода зависит от архитектуры вашего отчета. Для простых отчетов на макетах оптимален Способ 1, для высокопроизводительных систем — Способ 3, а для современных отчетов на управляемых формах идеальным выбором станет СКД.