Работа с печатными формами — одна из самых частых задач разработчика 1С. Часто возникает необходимость визуально выделить определенные данные, например, подсветить отрицательные остатки красным цветом или выделить важные реквизиты. В этой статье мы подробно разберем, как программно управлять оформлением ячеек в ТабличномДокументе, разберемся в тонкостях адресации и выясним, почему иногда "закрашивается весь столбец" вместо одной ячейки.
Прежде чем менять цвет, необходимо понять, как 1С работает с областями. Когда мы получаем область из макета с помощью метода ПолучитьОбласть(), мы создаем в памяти копию части шаблона. Важно помнить, что у этой области своя система координат.
Рассмотрим стандартный механизм вывода строк табличной части. Проанализируем ситуацию, когда нам нужно изменить цвет текста в конкретной колонке при соблюдении условия.
// Получаем макет и области
Макет = ПолучитьМакет("Печать");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Начинаем цикл по данным
Пока Выборка.Следующий() Цикл
// Заполняем параметры области данными
ОбластьСтрока.Параметры.Заполнить(Выборка);
// Проверяем условие для изменения цвета
Если Выборка.Сумма > 10000 Тогда
// Здесь мы будем менять цвет
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
В сообщениях форума часто упоминается метод Область("R1C1:R1C2"). Здесь кроется главная ловушка для начинающих разработчиков. Если вы вызываете метод Область() от объекта, который сам является областью (например, ОбластьСтрока), то координаты R1C1 всегда отсчитываются от левого верхнего угла этой конкретной области, а не от всего листа макета.
Разберем на примере: если ваша область ОбластьСтрока в макете расположена на 10-й строке, то для самой области это все равно будет R1 (первая строка области). Если вы ошибетесь в координатах, код либо не сработает, либо изменит цвет не в той ячейке.
Рекомендация: Чтобы не путаться в цифрах, используйте именованные ячейки. В конфигураторе выделите ячейку в макете, нажмите правую кнопку мыши — "Свойства" и заполните поле "Имя" (например, "ЯчейкаСумма"). Тогда обращение станет максимально простым:
ОбластьСтрока.Область("ЯчейкаСумма").ЦветТекста = WebЦвета.Красный;
Типичная ошибка, описанная в сообщении №15: после выполнения условия весь столбец в печатной форме становится цветным. Это происходит потому, что вы меняете свойства объекта-шаблона в переменной ОбластьСтрока. Один раз установив красный цвет, вы не возвращаете его обратно, и при следующей итерации цикла область выводится уже с красным текстом.
Есть два способа решить эту проблему:
Иначе, чтобы вернуть стандартный цвет для строк, не подходящих под условие.Вывести() возвращает ссылку на область, которая только что была добавлена в итоговый документ.Посмотрим на пример правильной реализации второго способа:
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
// Сначала выводим строку в документ
ВыведеннаяОбласть = ТабДок.Вывести(ОбластьСтрока);
// Теперь меняем оформление только в выведенной строке
Если Выборка.Сумма > 10000 Тогда
ВыведеннаяОбласть.Область("ЯчейкаСумма").ЦветТекста = WebЦвета.Красный;
ВыведеннаяОбласть.Область("ЯчейкаСумма").Шрифт = Новый Шрифт(,,Истина); // Делаем жирным
КонецЕсли;
КонецЦикла;
Проанализируем способы задания цвета. Вместо использования конструктора Новый Цвет(255, 0, 0), который не всегда нагляден, в 1С предусмотрены коллекции предопределенных цветов:
WebЦвета.Золотистый, WebЦвета.ЗеленыйЛес, WebЦвета.СветлоСерый). Это гарантирует, что цвет будет корректно отображаться на большинстве мониторов.ЦветаСтиля.ТекстОшибки). Это полезно для сохранения единого стиля интерфейса.Помимо строкового формата "R1C1", метод Область() поддерживает передачу числовых индексов. Это удобно при динамическом расчете колонок. Рассмотрим синтаксис:
Область(НомерСтрокиНачала, НомерКолонкиНачала, НомерСтрокиКонца, НомерКолонкиКонца)
Если нам нужно выделить одну ячейку, координаты начала и конца будут совпадать:
// Выделяем первую ячейку области (левый верхний угол)
Ячейка = ОбластьСтрока.Область(1, 1, 1, 1);
Ячейка.ЦветФона = WebЦвета.СветлоЖелтый;
Часто пользователи просят: "Я настроил цвета в списке на экране, хочу такие же на бумаге". Программно это разные механизмы (УсловноеОформление формы против свойств ТабличногоДокумента). Однако мы можем автоматизировать этот процесс. Если на форме заданы правила оформления, их можно программно перебрать в коллекции ЭтаФорма.УсловноеОформление.Элементы и применить аналогичные условия в коде формирования печатной формы. Хотя это требует написания дополнительного кода, такой подход значительно повышает удобство работы пользователя.
При выборе цветов помните о следующих нюансах:
Подводя итог, можно сказать: для корректного изменения цвета важно правильно определить область (желательно по имени), применять оформление к выведенной области и не забывать про читаемость данных при печати на бумаге. Для кастомизации макетов в типовых конфигурациях можно использовать готовый механизм постобработки печатных форм БСП, позволяющий изменять визуальное оформление документов без вмешательства в типовой код генерации.