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

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

При формировании отчетов или печатных форм в 1С часто возникает задача визуально выделить определенные данные. Например, если сумма превышает лимит или направление соответствует определенному критерию, мы хотим закрасить всю строку целиком. В этой статье мы подробно разберем, как правильно реализовать такое оформление в обычном приложении 1С, избежав типичных ошибок с «разъезжающимися» строками и падением производительности.

Метод 1: Использование возвращаемого значения метода Вывести()

Разберем наиболее эффективный и современный способ. Основная ошибка начинающих разработчиков заключается в попытке раскрасить область самого макета (шаблона) или обращении к фиксированным координатам типа R3C1:R3C30. Это приводит к тому, что либо раскрашивается шаблон и все последующие строки выходят закрашенными, либо создаются лишние пустые строки.

Проанализируем правильный подход: метод Вывести() объекта ТабличныйДокумент возвращает объект типа ОбластьЯчеекТабличногоДокумента, который соответствует именно тем ячейкам, которые только что были добавлены в итоговый документ. Это избавляет нас от необходимости высчитывать номера строк вручную.

Рассмотрим пример кода:


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

// 2. Предварительно получаем эталонное значение (оптимизация)
НужноеНаправление = Справочники.Направления.НайтиПоКоду(36);

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

В данном примере ВыведеннаяОбласть — это «живой» кусок вашего итогового отчета. Применяя к нему свойство ЦветФона, вы меняете оформление только одной конкретной строки.

Оптимизация производительности: почему нельзя искать в цикле?

Выясним причину, по которой код автора в исходном сообщении мог работать медленно. Вызов метода НайтиПоКоду() внутри цикла — это критическая ошибка. Если в отчете 1000 строк, система сделает 1000 лишних запросов к базе данных.

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

Метод 2: Динамическое определение границ через ВысотаТаблицы

Иногда возникают ситуации, когда результат метода Вывести() не был сохранен в переменную. В этом случае мы можем обратиться к последней строке табличного документа, используя свойство ВысотаТаблицы. Разберем, как это реализовать:


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

Этот способ удобен, если вам нужно раскрасить не всю строку целиком, а только определенный диапазон колонок (например, со 2-й по 5-ю) в текущей строке. В таком случае вместо ТабДок.ШиринаТаблицы укажите номер нужной колонки.

Дополнительные возможности оформления

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

  1. Шрифт: Если вы выделяете итоги, хорошим тоном считается сделать текст жирным. ВыведеннаяОбласть.Шрифт = Новый Шрифт(ВыведеннаяОбласть.Шрифт, , , Истина);
  2. Цвет текста: При использовании темного фона (например, синего или сливового) обязательно меняйте ЦветТекста на белый, иначе данные будут нечитаемыми. ВыведеннаяОбласть.ЦветТекста = WebЦвета.Белый;
  3. Границы: Можно программно выделить строку рамкой, используя свойство Область.ГраницаСнизу или Область.Обвести().

Типичные ошибки при работе с областями

Рассмотрим ситуацию, когда «создаются новые строки». Это происходит, если вы используете метод Область() для обращения к координатам, которые еще не существуют в документе или находятся за пределами текущего вывода.

Если вы написали ТабДок.Область("R3C1:R3C30"), а в вашем документе на текущий момент всего 2 строки, 1С принудительно создаст третью строку, чтобы применить к ней оформление. Именно поэтому крайне важно использовать либо возвращаемый объект от метода Вывести(), либо четко следить за индексом ТабДок.ВысотаТаблицы.

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

← На главную