Как программно изменить шрифт и цвет текста в ячейках табличного документа 1С (отчета СКД)?

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

При работе с отчетами в 1С, особенно созданными на Системе Компоновки Данных (СКД), часто возникает задача динамического изменения внешнего вида данных. Например, требуется выделить отрицательные значения красным цветом, важные итоги — жирным шрифтом, или даже полностью изменить форматирование строки в зависимости от содержимого ячеек. Мы рассмотрим два основных подхода к решению этой задачи: использование стандартного механизма условного оформления СКД и программное изменение ТабличногоДокумента после его формирования, при этом всегда можно упростить программное создание СКД, используя специализированные модули-обертки.

Прежде чем погрузиться в программные решения, давайте выясним, возможно ли решить нашу задачу стандартными средствами, ведь это всегда предпочтительнее и надежнее.

1. Использование условного оформления в СКД

Для большинства типовых случаев, когда условия форматирования достаточно статичны или могут быть выражены простыми выражениями, рекомендуется использовать встроенный механизм условного оформления СКД. Этот способ не требует написания кода и настраивается непосредственно в конструкторе отчета. Изучив Продвинутые приемы условного оформления в СКД, вы сможете эффективно использовать выражения и системные поля для более тонкой настройки отображения данных.

Как настроить условное оформление в СКД:

  1. Откройте схему компоновки данных вашего отчета (например, через конфигуратор или в пользовательском режиме, если используется пользовательская СКД с расширенными возможностями настройки).
  2. Перейте на закладку "Условное оформление".
  3. Нажмите кнопку "Добавить" для создания нового элемента условного оформления.
  4. В новом элементе мы увидим несколько вкладок и полей для настройки:
  5. После настройки сохраните схему компоновки данных. Если отчет запускается из конфигуратора, сохраните изменения в конфигурации.

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

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

2. Программное изменение шрифта и цвета через объект ТабличныйДокумент

Если условное оформление СКД не подходит, мы можем программно воздействовать на сформированный отчет. После того как СКД выведет данные в объект ТабличныйДокумент, мы получаем полный контроль над каждой его ячейкой и областью. Такая Программная обработка и оформление Табличного документа позволяет перебирать ячейки, проверять их значения и применять любое необходимое форматирование «на лету».

Для этого нам потребуется понимание того, что такое форматированный документ, и несколько ключевых объектов, через которые описывается модель СКД и её визуальное представление:

Разберем подробнее по шагам, как это можно реализовать.

Форматирование ячеек по условию (например, числовых значений)

Предположим, наша задача — выделить все отрицательные числа красным, положительные — синим, и применить жирный шрифт "Arial" размера 10 для всех числовых значений в отчете. Для этого мы должны пройтись по всем областям табличного документа, проверить их содержимое и применить форматирование.

Посмотрим на пример кода, который демонстрирует эту логику. Этот код размещается после того, как отчет СКД уже выведен в ТабличныйДокумент.


// ... Код формирования ТабличногоДокумента СКД ...

// Теперь программно меняем формат всех областей табличного документа
Для Каждого ОбластьТД Из ТабличныйДокумент.Области Цикл
    // Проверяем, содержит ли текущая область значение (не пустая ли она)
    Если ОбластьТД.СодержитЗначение Тогда
        // Проверяем тип значения. Нас интересуют только числа.
        Если ТипЗнч(ОбластьТД.Значение) = Тип("Число") Тогда
            // Применяем цвет текста в зависимости от знака числа
            Если ОбластьТД.Значение < 0 Тогда
                ОбластьТД.ЦветТекста = Новый Цвет(255, 0, 0); // Красный
            ИначеЕсли ОбластьТД.Значение > 0 Тогда
                ОбластьТД.ЦветТекста = Новый Цвет(0, 0, 255); // Синий
            КонецЕсли;
            
            // Устанавливаем шрифт: Arial, размер 10, жирный
            ОбластьТД.Шрифт = Новый Шрифт("Arial", 10, Истина, Ложь, Ложь, Ложь); 
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

// Показать сформированный и отформатированный табличный документ
ТабличныйДокумент.Показать();

В этом примере мы итерируем по коллекции ТабличныйДокумент.Области. Каждая итерация возвращает объект ОбластьТабличногоДокумента. В зависимости от значения, мы создаем новые объекты Цвет и Шрифт, настраивая такие параметры, как ИмяШрифта, Размер, Жирный и т.д.

Форматирование целых строк табличного документа

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

Проанализируем ситуацию, когда нам нужно найти строку с текстом "Итого:" в первой колонке и применить к ней особый шрифт и цвет текста.


// ... Предполагаем, что ТабличныйДокумент уже сформирован.

Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
    // Получаем область, соответствующую текущей строке.
    ОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки, 1, НомерСтроки, ТабличныйДокумент.ШиринаТаблицы);
    
    // Проверяем условие: текст в первой ячейке строки "Итого:".
    Если ОбластьСтроки.Ячейки.Получить(1, 1).Текст = "Итого:" Тогда
        // Если условие выполнено, применяем форматирование ко всем ячейкам в этой строке
        Для Каждого Ячейка Из ОбластьСтроки.Ячейки Цикл
            Ячейка.Шрифт = Новый Шрифт("Arial", 12, Истина, Ложь, Ложь, Ложь); // Жирный, увеличенный шрифт
            Ячейка.ЦветТекста = Новый Цвет(0, 100, 0); // Темно-зеленый
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

ТабличныйДокумент.Показать();

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

Дополнительные возможности и методы поиска в ТабличномДокументе

Помимо прямого перебора областей и строк, объект ТабличныйДокумент предоставляет и другие полезные методы для поиска и манипуляции с данными, которые могут значительно упростить код для специфичных задач:

Важно помнить, что программное изменение форматирования выполняется на уже сформированном табличном документе. Это означает, что любые изменения, сделанные через условное оформление СКД, будут применены первыми, а затем уже наши программные модификации могут их переопределить.

Заключение

Мы видим, что в 1С существует два основных подхода к динамическому форматированию отчетов: условное оформление СКД и программная работа с объектом ТабличныйДокумент. Каждый из них имеет свои преимущества и области применения:

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

← На главную