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

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

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

Почему возникают ошибки при окрашивании?

Основная проблема заключается в том, что начинающие разработчики пытаются манипулировать макетом напрямую. Важно понимать разницу: макет — это шаблон, а табличный документ — это итоговый результат вывода. Когда вы используете методы Вывести() или Присоединить(), вы работаете с живым объектом. Если обращаться к ячейкам по жестким координатам (например, R1C1), при изменении структуры таблицы цвета «поедут», так как координаты перестанут соответствовать ожидаемым данным.

Способ №1: Использование возвращаемого значения при выводе

Самый надежный способ управления оформлением — работа с объектом ОбластьЯчеекТабличногоДокумента, который возвращается методами вывода. Вместо того чтобы вычислять, где находится ячейка, мы просто берем то, что только что вывели, и меняем ему свойства.

Рассмотрим, как это выглядит на практике:


// Предположим, мы выводим секцию с данными
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДанных");
ОбластьМакета.Параметры.Дата = ТекущаяДата;

// Выводим область и сразу получаем ссылку на неё
ВыведеннаяОбласть = ТабличныйДокумент.Вывести(ОбластьМакета);

// Теперь можем безопасно менять цвет именно у этой строки
Если ДеньНедели(ТекущаяДата) > 5 Тогда
    ВыведеннаяОбласть.ЦветФона = WebЦвета.Желтый;
КонецЕсли;

Этот метод гарантирует, что вы покрасите именно ту строку, которую только что добавили в документ, независимо от того, сколько строк было в нем до этого.

Способ №2: Окрашивание после вывода строки по текущей высоте

Если ваша логика вывода сложнее (например, вы используете Присоединить()), можно ориентироваться на свойство ВысотаТаблицы. Это позволяет точно найти последнюю добавленную строку в результирующем табличном документе.

Разберем пример цикла:


Пока Выборка.Следующий() Цикл
    ЗаполнитьЗначенияСвойств(Область.Параметры, Выборка);
    ТабличныйДокумент.Вывести(Область);
    
    // Если это выходной, красим конкретную колонку в последней выведенной строке
    Если Выборка.ЭтоВыходной Тогда
        // Формируем адрес ячейки через строку
        Адрес = СтрШаблон("R%1C7", ТабличныйДокумент.ВысотаТаблицы);
        ТабличныйДокумент.Область(Адрес).ЦветФона = WebЦвета.Желтый;
    КонецЕсли;
КонецЦикла;

Ключевые рекомендации для корректного отображения

  1. Проверяйте свойства макета: Если в конфигураторе для ячеек макета уже задан цвет фона, он может конфликтовать с программным изменением. Убедитесь, что фон в макете установлен в значение «Авто».
  2. Объединение ячеек: Помните, что если в вашем макете ячейки объединены, обращение к любой из них через Область() приведет к окрашиванию всей группы. Это может быть как преимуществом, так и причиной «лишних» закрашенных зон.
  3. Используйте именованные области: Если структура отчета статична, всегда используйте именованные области в макете. Это делает код читаемым и устойчивым к изменениям: ТабличныйДокумент.Область("ИмяЯчейки").ЦветФона = ....

Когда стоит предпочесть Условное оформление?

Если вы строите отчет на системе компоновки данных (СКД), забудьте о ручном окрашивании в коде. Механизм Условного оформления в настройках СКД — это стандарт индустрии. Вы просто создаете правило «Если поле Выходной = Истина, то Цвет фона = Желтый», и платформа сама применит его ко всем ячейкам автоматически. Это избавляет от необходимости перебора строк в цикле и делает отчеты намного быстрее и легче в поддержке.

Подводя итог, можно сказать: всегда старайтесь работать с возвращаемыми объектами ОбластьЯчеекТабличногоДокумента вместо жесткого указания координат. Это сделает ваш код профессиональным, понятным и избавленным от ошибок позиционирования.

← На главную