Как изменить цвет текста и фона в печатной форме 1С 8.3

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

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

Основы работы с областями макета

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

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


// Получаем макет и области
Макет = ПолучитьМакет("Печать");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// Начинаем цикл по данным
Пока Выборка.Следующий() Цикл
    // Заполняем параметры области данными
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    
    // Проверяем условие для изменения цвета
    Если Выборка.Сумма > 10000 Тогда
        // Здесь мы будем менять цвет
    КонецЕсли;
    
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Проблема относительной адресации (R1C1)

В сообщениях форума часто упоминается метод Область("R1C1:R1C2"). Здесь кроется главная ловушка для начинающих разработчиков. Если вы вызываете метод Область() от объекта, который сам является областью (например, ОбластьСтрока), то координаты R1C1 всегда отсчитываются от левого верхнего угла этой конкретной области, а не от всего листа макета.

Разберем на примере: если ваша область ОбластьСтрока в макете расположена на 10-й строке, то для самой области это все равно будет R1 (первая строка области). Если вы ошибетесь в координатах, код либо не сработает, либо изменит цвет не в той ячейке.

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

ОбластьСтрока.Область("ЯчейкаСумма").ЦветТекста = WebЦвета.Красный;

Почему закрашивается весь столбец и как это исправить

Типичная ошибка, описанная в сообщении №15: после выполнения условия весь столбец в печатной форме становится цветным. Это происходит потому, что вы меняете свойства объекта-шаблона в переменной ОбластьСтрока. Один раз установив красный цвет, вы не возвращаете его обратно, и при следующей итерации цикла область выводится уже с красным текстом.

Есть два способа решить эту проблему:

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

Посмотрим на пример правильной реализации второго способа:


Пока Выборка.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    
    // Сначала выводим строку в документ
    ВыведеннаяОбласть = ТабДок.Вывести(ОбластьСтрока);
    
    // Теперь меняем оформление только в выведенной строке
    Если Выборка.Сумма > 10000 Тогда
        ВыведеннаяОбласть.Область("ЯчейкаСумма").ЦветТекста = WebЦвета.Красный;
        ВыведеннаяОбласть.Область("ЯчейкаСумма").Шрифт = Новый Шрифт(,,Истина); // Делаем жирным
    КонецЕсли;
КонецЦикла;

Использование системных и Web-цветов

Проанализируем способы задания цвета. Вместо использования конструктора Новый Цвет(255, 0, 0), который не всегда нагляден, в 1С предусмотрены коллекции предопределенных цветов:

Синтаксис метода Область()

Помимо строкового формата "R1C1", метод Область() поддерживает передачу числовых индексов. Это удобно при динамическом расчете колонок. Рассмотрим синтаксис:

Область(НомерСтрокиНачала, НомерКолонкиНачала, НомерСтрокиКонца, НомерКолонкиКонца)

Если нам нужно выделить одну ячейку, координаты начала и конца будут совпадать:


// Выделяем первую ячейку области (левый верхний угол)
Ячейка = ОбластьСтрока.Область(1, 1, 1, 1);
Ячейка.ЦветФона = WebЦвета.СветлоЖелтый;

Перенос условного оформления с формы в печать

Часто пользователи просят: "Я настроил цвета в списке на экране, хочу такие же на бумаге". Программно это разные механизмы (УсловноеОформление формы против свойств ТабличногоДокумента). Однако мы можем автоматизировать этот процесс. Если на форме заданы правила оформления, их можно программно перебрать в коллекции ЭтаФорма.УсловноеОформление.Элементы и применить аналогичные условия в коде формирования печатной формы. Хотя это требует написания дополнительного кода, такой подход значительно повышает удобство работы пользователя.

Особенности оформления для печати

При выборе цветов помните о следующих нюансах:

  1. Черно-белая печать: Яркие цвета на обычном принтере превращаются в оттенки серого. Желтый может стать невидимым, а темно-синий — неотличимым от черного. Всегда проверяйте контрастность.
  2. Производительность: Если в документе десятки тысяч строк, поочередное изменение свойств каждой ячейки может замедлить формирование формы. В таких случаях лучше заранее подготовить в макете две области (одну обычную, другую цветную) и выводить нужную в зависимости от условия.
  3. СКД: Если ваша печатная форма строится на Системе компоновки данных, забудьте про программный код. Используйте вкладку "Условное оформление" в настройках схемы — это быстрее, надежнее и проще в поддержке.

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

← На главную