При разработке отчетов на базе системы компоновки данных (СКД) часто возникают задачи нестандартного оформления результатов. Рассмотрим две распространенные ситуации: необходимость динамически изменять название колонки в зависимости от выбранного пользователем параметра отбора, а также вывод двух различных показателей в одну ячейку вида Остаток (Динамика).
Разберем по шагам доступные способы реализации обоих требований, а также проанализируем ограничения платформы 1С при работе со строковым форматированием.
Если требуется, чтобы имя колонки совпадает со значением выбранного параметра (например, наименованием характеристики или номенклатуры), стандартными настройками схемы компоновки данных обойтись не получится. Имена полей в схеме являются статическими. Однако эту задачу можно легко решить с помощью программного кода в модуле отчета.
Рассмотрим порядок действий для динамической подмены заголовка выбранного поля в модуле отчета:
ПриКомпоновкеРезультата().Заголовок у нужного элемента вывода.Проанализируем пример программной реализации:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ИмеющиесяДанные, СтандартнаяОбработка)
// Получаем значение параметра из настроек
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ВидРасчетаОтклонения").Значение;
// Обходим структуру отчета для поиска и смены заголовка поля
Для Каждого Группировка Из КомпоновщикНастроек.Настройки.Структура Цикл
Для Каждого Колонка Из Группировка.Колонки Цикл
Для Каждого Поле Из Колонка.Выбор.Элементы Цикл
Если Поле.Поле = Новый ПолеКомпоновкиДанных("ОтклонениеОстатка") Тогда
Поле.Заголовок = Строка(ЗначениеПараметра);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Обратите внимание: если пользователь изменяет параметры в форме отчета во время работы, значение параметра может находиться в коллекции пользовательских настроек (КомпоновщикНастроек.ПользовательскиеНастройки). В таком случае считывать значение необходимо именно оттуда.
Альтернативным безпрограммным решением является вынос аналитики в группировку колонок. Если требуемый параметр или реквизит добавить в группировку колонок таблицы СКД, заголовок колонки сформируется автоматически из представления выводимого объекта.
Выясним, как вывести в одной ячейке сразу два числовых значения в формате Остаток (Динамика), например 15 (+10).
Существует три основных способа реализации этой задачи:
Самый простой и гибкий метод — создание нового вычисляемого поля на вкладке Вычисляемые поля в схеме компоновки данных.
ОстатокИДинамикаСтрокой.Формат():
Формат(Остаток, "ЧДЦ=0") + " (" + Формат(Динамика, "ЧДЦ=0; ЧН=0; ЧО=+") + ")"
Если необходимо скрывать вывод динамики, если она равна нулю, можно использовать условное выражение:
Формат(Остаток, "ЧДЦ=0") + ВЫБОР КОГДА Динамика <> 0 ТОГДА " (" + Формат(Динамика, "ЧДЦ=0; ЧО=+") + ")" ИНАЧЕ "" КОНЕЦ
Если эти данные необходимо выводить и в итоговых группировках, на вкладке Ресурсы для данного вычисляемого поля необходимо прописать аналогичную формулу агрегирования с суммированием исходных числовых полей:
Формат(Сумма(Остаток), "ЧДЦ=0") + " (" + Формат(Сумма(Динамика), "ЧДЦ=0; ЧО=+") + ")"
Если к отчету предъявляются особые требования по визуальному оформлению, можно настроить собственный макет поля в СКД:
[Остаток] ([Динамика]).Остаток и Динамика с соответствующими полями набора данных и задаем для них форматирование.При оформлении комбинированных полей следует учитывать технические особенности платформы:
1. Отсутствие частичного форматирования внутри ячейки. В 1С невозможно применить разное оформление (например, сделать одно слово красным, а другое зеленым, или выводить часть текста верхним индексом) к отдельным фрагментам текста в рамках одной ячейки. Цвет, шрифт и размер всегда применяются ко всей ячейке целиком с помощью условного оформления.
2. Потеря числовых свойств и особенностей сортировки. При преобразовании чисел в строку результат становится текстовым полем. Сортировка по такому полю будет производиться по алфавиту, а не по значению чисел. Для корректной сортировки в настройках отчета следует настраивать сортировку по исходным числовым полям Остаток или Динамика.