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

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

При разработке печатных форм или отчетов на платформе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда программное изменение свойств ячейки (цвет фона, шрифт, цвет текста) не дает видимого результата. Вроде бы код написан верно, отладчик показывает, что условия выполняются и значения присваиваются, но в итоговом табличном документе ячейка остается стандартной. Разберем подробно, почему так происходит, и как правильно управлять оформлением областей.

Причина 1: Ловушка относительной адресации в локальных областях

Рассмотрим самую частую причину, с которой столкнулся автор темы. В 1С макет состоит из строк и колонок. Когда мы вызываем метод ПолучитьОбласть("ИмяОбласти"), система создает в оперативной памяти автономный табличный документ, который содержит только копию строк и колонок указанной области.

Проанализируем ситуацию: в основном макете ваша строка может находиться на 11-й строчке (R11). Но как только вы получили её как отдельную область, в этом новом объекте она становится первой строкой. Если вы пытаетесь обратиться к ней через ОбластьТело.Область("R11C3"), система ищет 11-ю строку внутри области, которая состоит, например, всего из одной строки. В результате адрес указывает «в пустоту», ошибка не генерируется, но и визуальных изменений мы не видим.

Правильный подход: при работе с полученной областью всегда используйте координаты относительно самой области. Если ваша область — это одна строка, то обращаться к её ячейкам нужно через индекс 1.


// Неправильно (если область содержит всего 1 строку):
ОбластьТело.Область("R11C3").ЦветФона = Новый Цвет(255, 207, 64);

// Правильно:
ОбластьТело.Область("R1C3").ЦветФона = Новый Цвет(255, 207, 64);
// Где R1 — это первая строка полученной области

Причина 2: Использование жестких координат вместо имен

Использование индексов типа R1C3 — это плохая практика («магические числа»). Если завтра бухгалтер попросит добавить в макет еще одну колонку слева, ваш код начнет раскрашивать не дату, а, например, количество, и вам придется переписывать весь модуль.

Выясним, как сделать код надежным. Для этого в конфигураторе нужно назначить ячейке имя (не путать с параметром). Выделите ячейку в макете, нажмите правую кнопку мыши — Свойства — Имя. Назовем её, например, ЯчейкаКрайняяДата. Теперь обращение в коде будет выглядеть так:


// Обращение по имени ячейки внутри области
ОбластьТело.Область("ЯчейкаКрайняяДата").ЦветФона = Новый Цвет(255, 207, 64);
ОбластьТело.Область("ЯчейкаКрайняяДата").Шрифт = Новый Шрифт(,, Истина); // Жирный

Такой подход делает код «неубиваемым»: как бы вы ни двигали ячейку внутри области макета, 1С найдет её по имени.

Причина 3: Эффект «залипания» оформления (Сброс цвета)

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

Разберем на примере, как правильно организовать сброс оформления:


Для Каждого СтрокаДанных Из СписокТоваров Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    Если СтрокаДанных.Просрочено Тогда
        ОбластьСтрока.Область("Дата").ЦветФона = Новый Цвет(255, 0, 0); // Красный
    Иначе
        // Обязательно сбрасываем цвет, если условие не выполнено!
        // Используем пустой конструктор цвета (автоматический цвет)
        ОбластьСтрока.Область("Дата").ЦветФона = Новый Цвет(); 
    КонецЕсли;
    
    ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Причина 4: Порядок вывода и модификации

Важно помнить последовательность действий. Изменения должны вноситься до того, как область будет выведена в итоговый документ методом Вывести().

  1. Получаем область из макета (ПолучитьОбласть).
  2. Заполняем параметры (Параметры.Заполнить).
  3. Программно меняем оформление (цвета, шрифты).
  4. Выводим готовую «раскрашенную» область в результат (Вывести).

Если вы сначала выполнили ТабДок.Вывести(ОбластьТело), а потом решили изменить ОбластьТело.ЦветФона, то в уже выведенной на экран строке ничего не изменится. Вам пришлось бы искать координаты уже в итоговом ТабличныйДокумент, что технически сложнее.

Альтернативный метод: Несколько областей в макете

Проанализируем ситуацию, когда цветов оформления много (например, статус заказа: «Новый», «В работе», «Завершен», «Отменен»). Писать огромные конструкции Если...ИначеЕсли с созданием объектов Новый Цвет не очень удобно и замедляет работу.

Вместо программного раскрашивания можно создать в макете несколько вариантов одной и той же строки. Назовем их: СтрокаОбычная, СтрокаКритичная, СтрокаУспех. Каждую строку в макете раскрасим интерактивно (мышкой в конфигураторе).

Посмотрим на пример кода в этом случае:


Если Данные.Статус = "Критично" Тогда
    Область = Макет.ПолучитьОбласть("СтрокаКритичная");
ИначеЕсли Данные.Статус = "Обычный" Тогда
    Область = Макет.ПолучитьОбласть("СтрокаОбычная");
КонецЕсли;

Область.Параметры.Заполнить(Данные);
ТабДок.Вывести(Область);

Преимущества этого метода:

  1. Высокая производительность (не создаются новые объекты цветов в памяти).
  2. Легкость настройки (дизайнер или пользователь может поменять цвета в макете без изменения кода).
  3. Код становится чище и понятнее.

Советы по оптимизации оформления

Если вы работаете с очень большими отчетами (десятки тысяч строк), прямое управление свойствами ЦветФона или Шрифт для каждой ячейки может привести к значительному потреблению оперативной памяти и замедлению формирования отчета.

В таких случаях рекомендуется использовать Систему компоновки данных (СКД). В СКД механизм «Условного оформления» работает на уровне движка платформы. Вы просто задаете условие (например, СрокГодности < 5) и выбираете цвет. Платформа сама оптимизирует процесс отрисовки, и вам не нужно заботиться об относительных координатах R1C1 или именах ячеек.

Подведем итог: если ваша ячейка не красится, первым делом проверьте, используете ли вы имя ячейки или относительные координаты (обычно R1). Убедитесь, что изменение происходит до метода Вывести, и не забывайте сбрасывать оформление для строк, не подходящих под условие.

← На главную