При формировании отчетов в 1С часто возникает задача визуального выделения итоговых строк или специфических данных. Окрашивание строк делает отчет более читаемым и профессиональным. В этой статье мы разберем несколько способов реализации этой задачи, начиная от простого изменения свойств области макета и заканчивая использованием системы компоновки данных (СКД).
Проанализируем самый эффективный метод, который позволяет избежать появления лишних пустых строк и корректно работает с динамическими данными. Суть метода заключается в том, чтобы установить свойство ЦветФона непосредственно у объекта ОбластьМакета перед тем, как она будет помещена в результирующий табличный документ.
Рассмотрим пример кода, где мы получаем область из макета, меняем её цвет и выводим в документ:
// Получаем область из макета по имени
Область = Макет.ПолучитьОбласть("СтрокаИтого");
// Устанавливаем нужный цвет (например, светло-серый)
Область.ЦветФона = Новый Цвет(230, 230, 230);
// Выводим уже раскрашенную область в итоговый документ
ТабДок.Вывести(Область);
Этот способ хорош тем, что 1С сначала подготавливает "чертеж" (область) с нужным оформлением, а затем копирует его в итоговый отчет. Это исключает лишние манипуляции с уже выведенными данными.
Выясним еще одну интересную особенность платформы 1С. Метод Вывести() является функцией, которая возвращает объект типа ОбластьЯчеекТабличногоДокумента. Эта область указывает именно на те ячейки, которые только что были добавлены в табличный документ. Это позволяет менять оформление "на лету" сразу после вывода.
Посмотрим на пример реализации:
// Выводим область и сразу получаем ссылку на выведенный диапазон
ВыведеннаяОбласть = ТабДок.Вывести(ОбластьМакета);
// Меняем цвет только у того фрагмента, который был выведен
ВыведеннаяОбласть.ЦветФона = Новый Цвет(192, 192, 192);
Важный нюанс: как было отмечено в обсуждении на форуме, иногда такой подход может привести к созданию лишних строк, если не контролировать границы области. Однако при правильном использовании он очень удобен для динамического изменения оформления в зависимости от условий, которые становятся известны только в момент вывода строки.
Если таблица имеет динамическое количество колонок, и нам нужно закрасить всю строку целиком после того, как она была сформирована, мы можем воспользоваться обращением к области по координатам. Для этого используются свойства ВысотаТаблицы и ШиринаТаблицы.
Разберем, как закрасить последнюю выведенную строку:
// Определяем номер текущей (последней) строки
НомерСтроки = ТабДок.ВысотаТаблицы;
// Получаем область от первой до последней колонки в этой строке
ОбластьСтроки = ТабДок.Область(НомерСтроки, 1, НомерСтроки, ТабДок.ШиринаТаблицы);
// Устанавливаем цвет фона
ОбластьСтроки.ЦветФона = Новый Цвет(255, 255, 0); // Желтый цвет
Этот метод незаменим, когда отчет формируется сложным образом (например, с использованием метода Присоединить()), и мы не знаем заранее, сколько колонок будет в строке "Итого".
Если вы разрабатываете отчет на базе Системы компоновки данных (СКД), программное раскрашивание строк через код модуля считается "плохим тоном". В СКД для этих целей существует механизм "Условного оформления".
Рассмотрим, как это настроить без программирования:
Цвет фона.Сотрудник В иерархии ... или наличие определенного признака в группировке).Этот способ наиболее производителен и автоматически адаптируется под любые изменения структуры отчета пользователем.
При работе с цветами рекомендуется придерживаться следующих правил для обеспечения кроссплатформенности и удобства поддержки:
Новый Цвет(R, G, B), старайтесь использовать системные цвета, например ЦветаСтиля.ЦветФонаГруппировки. Это позволит вашему отчету гармонично смотреться в любой теме интерфейса (например, в темной теме или теме "Такси").Новый Цвет в цикле может замедлить работу. Лучше создать переменную с цветом один раз перед началом вывода.ТабДок.Область(...), если в строке есть объединенные ячейки, оформление применится ко всему блоку. Проверяйте границы ячеек, так как изменение цвета фона иногда визуально "скрывает" сетку (границы). Для восстановления границ используйте свойство Область.ГраницаСверху, Область.ГраницаСнизу и т.д.Проанализировав все способы, можно сделать вывод: для простых отчетов на макетах идеально подходит Способ 1 (изменение макета до вывода), а для сложных аналитических систем лучшим выбором будет Условное оформление СКД.