При формировании отчетов или печатных форм в 1С часто возникает задача визуально выделить определенные данные. Например, если сумма превышает лимит или направление соответствует определенному критерию, мы хотим закрасить всю строку целиком. В этой статье мы подробно разберем, как правильно реализовать такое оформление в обычном приложении 1С, избежав типичных ошибок с «разъезжающимися» строками и падением производительности.
Разберем наиболее эффективный и современный способ. Основная ошибка начинающих разработчиков заключается в попытке раскрасить область самого макета (шаблона) или обращении к фиксированным координатам типа R3C1:R3C30. Это приводит к тому, что либо раскрашивается шаблон и все последующие строки выходят закрашенными, либо создаются лишние пустые строки.
Проанализируем правильный подход: метод Вывести() объекта ТабличныйДокумент возвращает объект типа ОбластьЯчеекТабличногоДокумента, который соответствует именно тем ячейкам, которые только что были добавлены в итоговый документ. Это избавляет нас от необходимости высчитывать номера строк вручную.
Рассмотрим пример кода:
// 1. Получаем макет и области
Макет = ПолучитьМакет("Макет");
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
ТабДок = Новый ТабличныйДокумент;
// 2. Предварительно получаем эталонное значение (оптимизация)
НужноеНаправление = Справочники.Направления.НайтиПоКоду(36);
// 3. Цикл обхода данных (например, выборки из запроса)
Пока Выборка.Следующий() Цикл
// Заполняем параметры области
ОбластьСтроки.Параметры.Заполнить(Выборка);
// Выводим область в результирующий документ и получаем ссылку на выведенную область
ВыведеннаяОбласть = ТабДок.Вывести(ОбластьСтроки);
// Проверяем условие
Если Выборка.Направление = НужноеНаправление Тогда
// Раскрашиваем именно ту область, которую только что вывели
ВыведеннаяОбласть.ЦветФона = WebЦвета.Сливовый;
КонецЕсли;
КонецЦикла;
В данном примере ВыведеннаяОбласть — это «живой» кусок вашего итогового отчета. Применяя к нему свойство ЦветФона, вы меняете оформление только одной конкретной строки.
Выясним причину, по которой код автора в исходном сообщении мог работать медленно. Вызов метода НайтиПоКоду() внутри цикла — это критическая ошибка. Если в отчете 1000 строк, система сделает 1000 лишних запросов к базе данных.
Важное правило: все ссылки, значения перечислений или коды, с которыми вы сравниваете данные, должны быть получены заранее и помещены в переменные до начала цикла формирования табличного документа. Это ускоряет работу алгоритма в десятки раз.
Иногда возникают ситуации, когда результат метода Вывести() не был сохранен в переменную. В этом случае мы можем обратиться к последней строке табличного документа, используя свойство ВысотаТаблицы. Разберем, как это реализовать:
ТабДок.Вывести(ОбластьСтроки);
Если УсловиеВыполнено Тогда
НомерСтроки = ТабДок.ВысотаТаблицы;
// Определяем область: (Верх, Лево, Низ, Право)
// Закрашиваем от 1-й колонки до последней заполненной
ОбластьДляПокраски = ТабДок.Область(НомерСтроки, 1, НомерСтроки, ТабДок.ШиринаТаблицы);
ОбластьДляПокраски.ЦветФона = WebЦвета.Золотистый;
КонецЕсли;
Этот способ удобен, если вам нужно раскрасить не всю строку целиком, а только определенный диапазон колонок (например, со 2-й по 5-ю) в текущей строке. В таком случае вместо ТабДок.ШиринаТаблицы укажите номер нужной колонки.
Проанализируем, какие еще свойства, кроме ЦветФона, помогут сделать отчет более читаемым:
ВыведеннаяОбласть.Шрифт = Новый Шрифт(ВыведеннаяОбласть.Шрифт, , , Истина);
ЦветТекста на белый, иначе данные будут нечитаемыми.
ВыведеннаяОбласть.ЦветТекста = WebЦвета.Белый;
Область.ГраницаСнизу или Область.Обвести().Рассмотрим ситуацию, когда «создаются новые строки». Это происходит, если вы используете метод Область() для обращения к координатам, которые еще не существуют в документе или находятся за пределами текущего вывода.
Если вы написали ТабДок.Область("R3C1:R3C30"), а в вашем документе на текущий момент всего 2 строки, 1С принудительно создаст третью строку, чтобы применить к ней оформление. Именно поэтому крайне важно использовать либо возвращаемый объект от метода Вывести(), либо четко следить за индексом ТабДок.ВысотаТаблицы.
Также помните, что изменения в объекте ОбластьПараметров (который вы получили из макета) до вывода в документ могут привести к тому, что все последующие строки унаследуют это оформление. Поэтому всегда меняйте свойства оформления у результата вывода, а не у исходного шаблона макета.