При разработке отчетов часто возникает необходимость оформить итоговые показатели или ресурсы так, чтобы перед числовым значением отображалась поясняющая надпись — например, текст «Бонусных баллов» слева от выводимой суммы остатка. В типовых решениях прошлых поколений отчеты строились с применением механизма ПостроительОтчета и библиотеки «Универсальный отчет». При попытке добавить статичную строку в запрос разработчики нередко сталкиваются с тем, что добавленное поле не появляется в настройках или не выводится в строке итогов.
В этой статье мы подробно разберем, почему добавление константной строки в текст запроса не дает результата в «Универсальном отчете», как правильно настроить построитель отчета и какие современные возможности предоставляет Система компоновки данных (СКД) для решения этой задачи.
Рассмотрим типовую ситуацию. В исходном запросе разработчик добавляет константную текстовую строку в основной список выборки:
ВЫБРАТЬ
ВложенныйЗапрос.Бонусы КАК Бонусы,
"Баллов строка" КАК БалловСтрока,
ВложенныйЗапрос.Замена.Владелец.Владелец КАК Клиент,
// ... остальные поля
{ВЫБРАТЬ
Клиент.*,
// ...
Бонусы}
// ...
ИТОГИ ПО
Договор
{ИТОГИ ПО
Договор.*,
Бонусы}
После изменения текста запроса новое поле не появляется в настройках строк и колонок отчета. Проанализируем ключевые причины такого поведения:
ПостроительОтчета использует специальные конструкции в фигурных скобках {ВЫБРАТЬ ...}, {ГДЕ ...}, {ИТОГИ ПО ...}. Если поле добавлено только в секцию ВЫБРАТЬ языка запросов, но не объявлено в блоке {ВЫБРАТЬ ...}, построитель не предоставит его пользователю для вывода в состав полей.Если проект требует оставить отчет на базе построителя, разберем по шагам, как вывести строковое значение:
{ВЫБРАТЬ} и {ИТОГИ ПО}:
ВЫБРАТЬ
ВложенныйЗапрос.Бонусы КАК Бонусы,
"Бонусных баллов:" КАК ПодписьБонусов,
ВложенныйЗапрос.Замена.Владелец КАК Договор
{ВЫБРАТЬ
Договор.*,
ПодписьБонусов,
Бонусы}
ИТОГИ
СУММА(Бонусы)
ПО
Договор
{ИТОГИ ПО
Договор.*,
ПодписьБонусов,
Бонусы}
ПостроительОтчета.ВыбранныеПоля.ПостроительОтчета.Макет), указав в ячейке нужный статичный текст или шаблон.Перевод отчета на СКД является наиболее надежным и гибким решением. СКД предоставляет сразу несколько штатных инструментов для размещения надписей рядом с данными без модификации логики запроса.
Разберем по шагам создание составной строки средствами настроек компоновки:
Бонусы. В результате в сформированном отчете данные будут выведены в одну строку последовательно слева направо.Если требуется строго задать внешний вид и объединение ячеек в шапке или строке группировки:
Текст), а в правую ячейку поместим параметр ПараметрБонусы (тип ячейки — Параметр или Шаблон).ПараметрБонусы с полем схемы компоновки Бонусы.Если надпись должна быть неотделимой частью самого значения, используем вычисляемые поля на соответствующей вкладке схемы:
"Бонусных баллов: " + Формат(Бонусы, "ЧДЦ=2; ЧН=0")
Также можно настроить Условное оформление для ресурса Бонусы, задав параметр «Формат» с префиксом или параметр «Текст» по определенному условию.
Проанализируем текст исходного запроса и исправим критические ошибки, влияющие на производительность:
// Исходный неоптимальный фрагмент:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СмузБонусы.Остатки КАК СмузБонусыОстатки
ПО _Замена.Владелец.Владелец = СмузБонусыОстатки.Контрагент
И _Замена.Владелец.Организация = СмузБонусыОстатки.Организация
В данном фрагменте присутствуют две серьезные проблемы:
_Замена.Владелец.Владелец создают скрытые неявные соединения таблиц в СУБД, что сильно замедляет выполнение запроса. Необходимо соединять таблицы по прямым ссылкам или предварительно получать реквизиты во временную таблицу.ПО: Обращение к РегистрНакопления.СмузБонусы.Остатки без параметров периода и условий заставляет платформу считывать весь объем итогов регистра. Параметры отбора и период должны передаваться непосредственно в круглые скобки виртуальной таблицы: РегистрНакопления.СмузБонусы.Остатки(&Период, ).Перевод отчета на СКД с оптимизацией обращений к регистрам решает задачу оформления надписей и обеспечивает высокую скорость формирования отчета на любых объемах данных.