При разработке отчетов и печатных форм в 1С часто возникает необходимость визуально выделять определенные данные, меняя цвет текста в ячейках табличного документа в зависимости от выполнения каких-либо условий. Это позволяет пользователю быстро акцентировать внимание на критически важной информации, например, на отрицательных остатках, просроченных задачах или отклонениях от плановых показателей.
Давайте подробно рассмотрим, как мы можем программно управлять цветом текста в ячейках табличного документа, используя различные подходы в 1С:Предприятии.
Этот метод является одним из самых простых и наглядных, особенно когда количество различных вариантов оформления ограничено. Мы создаем в макете табличного документа несколько областей, которые отличаются только оформлением (например, цветом шрифта), а затем программно выбираем, какую область выводить, исходя из условий.
Преимущества:
Как это работает:
Пример кода:
Предположим, у нас есть макет с двумя областями: СтрокаКрасная и СтрокаЧерная. Мы хотим выделить красным цветом строки, где количество меньше остатка.
// Предположим, Макет - это объект МакетТабличногоДокумента,
// а ТабличныйДокумент - это объект ТабличныйДокумент
// и Выборка - это результат запроса с полями Количество и Остаток
// Получаем области из макета
ОбластьКрасная = Макет.ПолучитьОбласть("СтрокаКрасная");
ОбластьЧерная = Макет.ПолучитьОбласть("СтрокаЧерная");
Пока Выборка.Следующий() Цикл
// Определяем, какую область использовать, в зависимости от условия
Если Выборка.Остаток < Выборка.Количество Тогда
ТекущаяОбласть = ОбластьКрасная;
Иначе
ТекущаяОбласть = ОбластьЧерная;
КонецЕсли;
// Заполняем параметры текущей области
// Здесь предполагается, что в областях макета есть параметры,
// например, Параметры.Наименование, Параметры.Количество, Параметры.Остаток
ТекущаяОбласть.Параметры.Заполнить(Выборка);
// Выводим заполненную область в табличный документ
ТабличныйДокумент.Вывести(ТекущаяОбласть);
КонецЦикла;
Мы видим, что этот подход является очень гибким и понятным, особенно когда заранее известны все возможные варианты оформления.
Этот метод дает нам больше контроля над оформлением, позволяя динамически изменять свойства конкретных ячеек (или их диапазонов) в выбранной области макета непосредственно перед её выводом. Это удобно, когда условий для раскраски много, или цвета могут быть заданы динамически (например, из настроек пользователя).
Как это работает:
Области у полученной области макета, мы можем получить доступ к отдельным ячейкам внутри этой области по их именам (если ячейки именованы в макете) или по координатам.ЦветТекста: Для полученной ячейки или диапазона ячеек устанавливаем свойство ЦветТекста.Важный нюанс: Мы изменяем свойство у объекта ОбластьМакета или его подобластей, а не у уже выведенного ТабличногоДокумента. Это происходит до того, как область попадает на печатную форму.
Пример кода:
Предположим, у нас есть область макета с именем ОбластьСтрокаТаблицы, и внутри неё есть именованная ячейка ОплатаПоФакту. Мы хотим изменить цвет текста в этой ячейке в зависимости от условия.
// Предположим, Макет - это объект МакетТабличногоДокумента,
// а ТабличныйДокумент - это объект ТабличныйДокумент
// и ВыборкаПоГрафикамОплат - это результат запроса с нужными полями
Пока ВыборкаПоГрафикамОплат.Следующий() Цикл
// Получаем область из макета (например, с именем "СтрокаДанных")
ОбластьСтрокаТаблицы = Макет.ПолучитьОбласть("СтрокаДанных");
// Заполняем параметры области данными из выборки
// Здесь предполагается, что параметры в области соответствуют полям выборки
ОбластьСтрокаТаблицы.Параметры.Заполнить(ВыборкаПоГрафикамОплат);
// Применяем условное оформление к ячейке внутри области перед её выводом
Если ВыборкаПоГрафикамОплат.Организация = УправленческаяОрганизация Тогда
// Обращаемся к именованной ячейке внутри области и меняем её ЦветТекста
ОбластьСтрокаТаблицы.Области.ОплатаПоФакту.ЦветТекста = WebЦвета.Синий;
ИначеЕсли ВыборкаПоГрафикамОплат.ОплатаПросрочена Тогда
ОбластьСтрокаТаблицы.Области.ОплатаПоФакту.ЦветТекста = WebЦвета.Красный;
Иначе
ОбластьСтрокаТаблицы.Области.ОплатаПоФакту.ЦветТекста = WebЦвета.Черный;
КонецЕсли;
// Выводим измененную область в табличный документ
ТабличныйДокумент.Вывести(ОбластьСтрокаТаблицы);
КонецЦикла;
Мы видим, что в этом примере мы обращаемся к конкретной ячейке ОплатаПоФакту внутри нашей области ОбластьСтрокаТаблицы. Этот подход обеспечивает высокую гибкость, позволяя менять оформление отдельных элементов в строке.
Этот метод позволяет нам изменять цвет текста уже после того, как область или ячейка были выведены в итоговый табличный документ. Это может быть полезно в случаях, когда требуется пост-обработка документа или когда условия для раскраски становятся известны только после предварительного вывода данных.
Как это работает:
ТабличныйДокумент.Область() объекта ТабличныйДокумент, указывая координаты.ЦветТекста: Для полученной ячейки или диапазона ячеек устанавливаем свойство ЦветТекста.Пример кода:
Предположим, мы выводим данные в табличный документ, а затем хотим изменить цвет текста в определенной ячейке, которая находится по координатам (1,1,1,1), если выполнено некое условие.
// Предположим, ТабличныйДокумент - это объект ТабличныйДокумент,
// и ОбластьМакета - это область, которую мы хотим вывести.
// Количество - это переменная с неким значением.
// Заполняем параметры области макета
ОбластьМакета.Параметры.Количество = Количество;
ОбластьМакета.Параметры.Наименование = "Некий товар";
// Выводим область макета в табличный документ.
// После вывода, данные появятся в строке 1, колонке 1 (если это первая выводимая область и она занимает одну ячейку)
ТабличныйДокумент.Вывести(ОбластьМакета);
// Теперь мы можем обратиться к ячейке уже выведенного документа по её координатам
// и изменить её цвет текста, если условие выполняется.
// Здесь 1,1,1,1 означает первую строку, первый столбец, по первую строку, первый столбец (т.е. одну ячейку)
Если Количество > 0 Тогда
// Получаем ссылку на конкретную ячейку в уже выведенном документе
ЯчейкаВыведенногоДокумента = ТабличныйДокумент.Область(1,1,1,1);
// Изменяем цвет текста этой ячейки
ЯчейкаВыведенногоДокумента.ЦветТекста = Новый Цвет(255,0,0); // Красный цвет
Иначе
ЯчейкаВыведенногоДокумента = ТабличныйДокумент.Область(1,1,1,1);
ЯчейкаВыведенногоДокумента.ЦветТекста = WebЦвета.Зеленый;
КонецЕсли;
Мы должны быть внимательны при использовании этого метода, так как координаты ячеек могут меняться в зависимости от структуры выводимого отчета, динамического количества строк и столбцов. Обычно этот метод более применим для фиксированных областей или для пост-обработки. Чтобы избежать проблем с координатами, предпочтительнее использовать именованные ячейки/области в макете и обращаться к ним до вывода, как в Методе 2.
Хотя исходный вопрос касался макета табличного документа, часто возникает похожая задача для табличных полей в управляемых формах. Для этого существует мощный механизм условного оформления, который позволяет задавать правила изменения внешнего вида элементов формы (включая цвет текста и фона) в зависимости от данных.
Условное оформление можно настроить как интерактивно в конфигураторе, так и программно.
Как это работает программно (для табличных полей на форме):
В процедуре ПриПолученииДанных табличного поля или в другом месте, где доступны данные строки, мы можем обратиться к объекту ОформлениеСтроки и его ячейкам.
Пример кода:
// Этот код выполняется, например, в обработчике события ПриПолученииДанных для табличного поля
// на управляемой форме.
// ДанныеСтроки - это текущая строка данных, для которой происходит оформление
// ОформлениеСтроки - это объект, через который мы управляем оформлением текущей строки
// Предположим, что в табличном поле есть колонка "ВРаботе"
Если НЕ ДанныеСтроки.ВРаботе Тогда
ОформлениеСтроки.Ячейки.ВРаботе.ЦветТекста = WebЦвета.Серый; // Меняем цвет текста на серый
ОформлениеСтроки.Ячейки.ВРаботе.ЦветФона = ЦветаСтиля.СтатусОтклонен; // А фон на цвет статуса
Иначе
ОформлениеСтроки.Ячейки.ВРаботе.ЦветТекста = WebЦвета.Черный; // Возвращаем обычный цвет
ОформлениеСтроки.Ячейки.ВРаботе.ЦветФона = WebЦвета.Белый; // Возвращаем обычный фон
КонецЕсли;
// Рассмотрим другой пример для условного оформления других полей
// ЗаказыНаПроизводство = ПолучитьЗаказыНаПроизводство(ДанныеСтроки.ЗаказПокупателя); // Пример получения связанных данных
// НетТН = Ложь;
// Для Каждого ТекСтрока Из ЗаказыНаПроизводство Цикл
// НетТН = ПолучитьТребованиеНакладную(ТекСтрока.ЗаказНаПроизводство); // Пример какой-то проверки
// Если НетТН Тогда
// Прервать;
// КонецЕсли;
// КонецЦикла;
// Если НетТН Тогда
// ОформлениеСтроки.Ячейки.ДатаВыпускаПлан.ЦветФона = WebЦвета.Фиолетовый; // Пример изменения фона
// КонецЕсли;
// Если ДанныеСтроки.Паллетирование Тогда
// ОформлениеСтроки.Ячейки.ФБ_СкладХранения.ЦветФона = WebЦвета.НасыщенноРозовый; // Пример изменения фона
// КонецЕсли;
Мы должны помнить, что этот метод применяется к табличным полям, отображающим данные на управляемой форме, и отличается от работы с макетами и формированием печатных форм в объекте ТабличныйДокумент. Однако принцип условного оформления остается тем же.
WebЦвета и Новый Цвет()В 1С для задания цвета текста или фона мы можем использовать два основных способа:
WebЦвета: Это набор стандартных, часто используемых цветов, таких как WebЦвета.Красный, WebЦвета.Синий, WebЦвета.СветлоСерый и так далее. Использование WebЦвета упрощает код и делает его более читаемым, поскольку не нужно запоминать RGB-коды.Цвет: Если нам нужен уникальный цвет, которого нет в WebЦвета, мы можем создать его, указав RGB-компоненты (красный, зеленый, синий) в диапазоне от 0 до 255.
// Создание красного цвета
МойКрасныйЦвет = Новый Цвет(255, 0, 0);
// Создание фиолетового цвета
МойФиолетовыйЦвет = Новый Цвет(128, 0, 128);
Мы выбираем подходящий способ в зависимости от требований к цветовой палитре нашего отчета или формы.
ОбластьМакета.Области.ИмяЯчейки.ЦветТекста) и делает код более поддерживаемым.МакетТабличногоДокумента (шаблон) и объектом ТабличныйДокумент (результат вывода). Изменение свойств, таких как цвет текста, должно применяться либо к области, полученной из макета, непосредственно перед её выводом в ТабличныйДокумент, либо к уже выведенным ячейкам в ТабличныйДокумент. Попытка изменить цвет текста на самом объекте МакетТабличногоДокумента после его получения не даст желаемого результата для выводимого отчета.ЦветТекста против ЦветФона: Мы должны четко различать эти два свойства. ЦветТекста меняет цвет шрифта, а ЦветФона - цвет заливки ячейки. Часто для лучшего визуального эффекта используются оба свойства.Текст ячейки. Это предоставляет очень гибкий способ оформления части текста в ячейке, а не всей ячейки целиком.
МояСтрока = Новый ФорматированнаяСтрока;
МояСтрока.Добавить("Часть текста обычного цвета. ");
МояСтрока.Добавить("Важный текст!", Новый Шрифт(,,Истина), WebЦвета.Красный);
// Присваиваем форматированную строку тексту ячейки:
// ОбластьМакета.Параметры.МойТекст = МояСтрока;
// или
// ОбластьМакета.Области.ИмяЯчейки.Текст = МояСтрока;
Выбор конкретного метода зависит от сложности условий, требуемой гибкости оформления и структуры вашего отчета или формы. В большинстве случаев комбинация этих подходов позволяет достичь желаемого результата.