Как вывести текстовую надпись слева от числового поля или группировки строк в отчете 1С

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

При разработке отчетов часто возникает необходимость оформить итоговые показатели или ресурсы так, чтобы перед числовым значением отображалась поясняющая надпись — например, текст «Бонусных баллов» слева от выводимой суммы остатка. В типовых решениях прошлых поколений отчеты строились с применением механизма ПостроительОтчета и библиотеки «Универсальный отчет». При попытке добавить статичную строку в запрос разработчики нередко сталкиваются с тем, что добавленное поле не появляется в настройках или не выводится в строке итогов.

В этой статье мы подробно разберем, почему добавление константной строки в текст запроса не дает результата в «Универсальном отчете», как правильно настроить построитель отчета и какие современные возможности предоставляет Система компоновки данных (СКД) для решения этой задачи.

Анализ проблемы: почему текстовая строка не отображается в Универсальном отчете

Рассмотрим типовую ситуацию. В исходном запросе разработчик добавляет константную текстовую строку в основной список выборки:


ВЫБРАТЬ
    ВложенныйЗапрос.Бонусы КАК Бонусы,
    "Баллов строка" КАК БалловСтрока,
    ВложенныйЗапрос.Замена.Владелец.Владелец КАК Клиент,
    // ... остальные поля
{ВЫБРАТЬ
    Клиент.*,
    // ...
    Бонусы}
// ...
ИТОГИ ПО
    Договор
{ИТОГИ ПО
    Договор.*,
    Бонусы}

После изменения текста запроса новое поле не появляется в настройках строк и колонок отчета. Проанализируем ключевые причины такого поведения:

  1. Отсутствие поля в секциях управления построителя: Механизм ПостроительОтчета использует специальные конструкции в фигурных скобках {ВЫБРАТЬ ...}, {ГДЕ ...}, {ИТОГИ ПО ...}. Если поле добавлено только в секцию ВЫБРАТЬ языка запросов, но не объявлено в блоке {ВЫБРАТЬ ...}, построитель не предоставит его пользователю для вывода в состав полей.
  2. Специфика инициализации в коде модуля: В обработках на базе объекта «УниверсальныйОтчет» состав доступных полей, группировок и показателей регистрируется программно при инициализации (методами добавления измерений, показателей и дополнительных полей). Изменения только текста запроса без корректировки модуля отчета недостаточно.
  3. Ограничение вывода строк в итогах: Построитель отчета жестко разграничивает группировочные поля и ресурсы. Вывести строковое поле «в одной строке слева от итога» без изменения макета оформления невозможно, так как строка считается либо отдельной группировкой, либо детальной записью.

Способ 1. Корректная настройка построителя отчета и Универсального отчета

Если проект требует оставить отчет на базе построителя, разберем по шагам, как вывести строковое значение:

  1. Объявление поля в директивах построителя: Добавим поле как в основной запрос, так и в секции {ВЫБРАТЬ} и {ИТОГИ ПО}:
    
    ВЫБРАТЬ
        ВложенныйЗапрос.Бонусы КАК Бонусы,
        "Бонусных баллов:" КАК ПодписьБонусов,
        ВложенныйЗапрос.Замена.Владелец КАК Договор
    {ВЫБРАТЬ
        Договор.*,
        ПодписьБонусов,
        Бонусы}
    ИТОГИ
        СУММА(Бонусы)
    ПО
        Договор
    {ИТОГИ ПО
        Договор.*,
        ПодписьБонусов,
        Бонусы}
    
  2. Программная регистрация поля: В процедуре настройки отчета добавим регистрацию нового поля в измерениях строк с типом размещения «Вместе» или через свойство ПостроительОтчета.ВыбранныеПоля.
  3. Использование собственного макета: Для точного позиционирования текста слева от значения переопределим макет оформления построителя (свойство ПостроительОтчета.Макет), указав в ячейке нужный статичный текст или шаблон.

Способ 2. Решение задачи в Системе компоновки данных (СКД)

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

Вариант А. Горизонтальная группа полей

Разберем по шагам создание составной строки средствами настроек компоновки:

  1. Откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. В структуре отчета перейдем в выбранные поля нужной группировки.
  3. Нажмем «Добавить» — «Новая группа».
  4. В свойствах созданной группы укажем «Расположение» — «Горизонтально».
  5. Поместим внутрь группы текстовое поле (или пользовательское поле со статичным текстом) и поле ресурса Бонусы. В результате в сформированном отчете данные будут выведены в одну строку последовательно слева направо.

Вариант Б. Пользовательский макет оформления

Если требуется строго задать внешний вид и объединение ячеек в шапке или строке группировки:

  1. В схеме компоновки данных перейдем на вкладку «Макеты».
  2. Добавим «Макет группировки» или «Макет поля» для нужного уровня иерархии.
  3. В табличном документе макета нарисуем необходимую область: в левую ячейку введем текст «Бонусных баллов» (тип ячейки — Текст), а в правую ячейку поместим параметр ПараметрБонусы (тип ячейки — Параметр или Шаблон).
  4. В таблице параметров макета свяжем ПараметрБонусы с полем схемы компоновки Бонусы.

Вариант В. Вычисляемые поля и форматирование

Если надпись должна быть неотделимой частью самого значения, используем вычисляемые поля на соответствующей вкладке схемы:

"Бонусных баллов: " + Формат(Бонусы, "ЧДЦ=2; ЧН=0")

Также можно настроить Условное оформление для ресурса Бонусы, задав параметр «Формат» с префиксом или параметр «Текст» по определенному условию.

Оптимизация исходного запроса к базе данных

Проанализируем текст исходного запроса и исправим критические ошибки, влияющие на производительность:


// Исходный неоптимальный фрагмент:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СмузБонусы.Остатки КАК СмузБонусыОстатки 
ПО _Замена.Владелец.Владелец = СмузБонусыОстатки.Контрагент 
И _Замена.Владелец.Организация = СмузБонусыОстатки.Организация

В данном фрагменте присутствуют две серьезные проблемы:

  1. Разыменование полей через точку в условии соединения: Конструкции _Замена.Владелец.Владелец создают скрытые неявные соединения таблиц в СУБД, что сильно замедляет выполнение запроса. Необходимо соединять таблицы по прямым ссылкам или предварительно получать реквизиты во временную таблицу.
  2. Фильтрация виртуальной таблицы в секции ПО: Обращение к РегистрНакопления.СмузБонусы.Остатки без параметров периода и условий заставляет платформу считывать весь объем итогов регистра. Параметры отбора и период должны передаваться непосредственно в круглые скобки виртуальной таблицы: РегистрНакопления.СмузБонусы.Остатки(&Период, ).

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

← На главную