При работе с отчетами в 1С, особенно созданными на Системе Компоновки Данных (СКД), часто возникает задача динамического изменения внешнего вида данных. Например, требуется выделить отрицательные значения красным цветом, важные итоги — жирным шрифтом, или даже полностью изменить форматирование строки в зависимости от содержимого ячеек. Мы рассмотрим два основных подхода к решению этой задачи: использование стандартного механизма условного оформления СКД и программное изменение ТабличногоДокумента после его формирования, при этом всегда можно упростить программное создание СКД, используя специализированные модули-обертки.
Прежде чем погрузиться в программные решения, давайте выясним, возможно ли решить нашу задачу стандартными средствами, ведь это всегда предпочтительнее и надежнее.
Для большинства типовых случаев, когда условия форматирования достаточно статичны или могут быть выражены простыми выражениями, рекомендуется использовать встроенный механизм условного оформления СКД. Этот способ не требует написания кода и настраивается непосредственно в конструкторе отчета. Изучив Продвинутые приемы условного оформления в СКД, вы сможете эффективно использовать выражения и системные поля для более тонкой настройки отображения данных.
Как настроить условное оформление в СКД:
ЗначениеПоля < 0, где ЗначениеПоля — это имя вашего поля в отчете (его можно выбрать из списка доступных полей).Механизм условного оформления СКД очень мощный и гибкий. Он позволяет задавать несколько условий и комбинировать их, а также применять различные виды оформления для разных частей отчета. Кроме того, штатный механизм обеспечивает лучшую Оптимизацию вывода и оформления больших отчетов, так как работает на уровне движка компоновки, а не через медленный перебор ячеек готового документа.
Однако, как отметил автор темы, бывают ситуации, когда условия форматирования слишком динамичны, зависят от сложных расчетов, которые невозможно выразить в рамках выражений СКД, или требуют анализа уже сформированного табличного документа. Например, если условие зависит от совокупности значений в разных строках или требует выполнения сложных алгоритмов, не вписывающихся в синтаксис выражений СКД. В таких случаях нам понадобится программный подход.
ТабличныйДокументЕсли условное оформление СКД не подходит, мы можем программно воздействовать на сформированный отчет. После того как СКД выведет данные в объект ТабличныйДокумент, мы получаем полный контроль над каждой его ячейкой и областью. Такая Программная обработка и оформление Табличного документа позволяет перебирать ячейки, проверять их значения и применять любое необходимое форматирование «на лету».
Для этого нам потребуется понимание того, что такое форматированный документ, и несколько ключевых объектов, через которые описывается модель СКД и её визуальное представление:
ТабличныйДокумент: Основной объект, представляющий сформированный табличный документ. Мы получаем его после вывода отчета СКД, например, через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.ОбластьТабличногоДокумента: Представляет собой прямоугольную область ячеек в табличном документе. Это может быть как одна ячейка, так и целый диапазон (строка, колонка, блок).ЯчейкаТабличногоДокумента: Представляет отдельную ячейку. Свойства ЦветТекста, ЦветФона, Шрифт доступны как для ОбластьТабличногоДокумента, так и для ЯчейкаТабличногоДокумента.Цвет: Объект, используемый для указания цвета. Он создается с помощью конструктора Новый Цвет(Красный, Зеленый, Синий).Шрифт: Объект, используемый для указания параметров шрифта. Создается через Новый Шрифт(ИмяШрифта, Размер, Жирный, Курсив, Подчеркнутый, Зачеркнутый).Разберем подробнее по шагам, как это можно реализовать.
Предположим, наша задача — выделить все отрицательные числа красным, положительные — синим, и применить жирный шрифт "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С.Выбирая подходящий метод, мы можем достичь максимальной гибкости и наглядности в наших отчетах 1С, делая их более информативными и удобными для пользователя, при этом сохраняя оптимальную производительность и удобство сопровождения.