Как вывести строковый показатель в Универсальном отчете без детальных записей?

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

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

В этой статье мы подробно разберем, как заставить систему отображать строковые данные на уровне итогов и группировок, не прибегая к выводу каждой отдельной записи. Мы проанализируем механизмы работы ресурсов и выясним, почему стандартное добавление показателя через УниверсальныйОтчет.ДобавитьПоказатель не всегда дает нужный результат.

Разбор проблемы: почему пропадают строки?

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

Решение 1: Использование агрегатной функции Максимум

Самый эффективный способ вывести строку в колонку итогов — это объявить её ресурсом и использовать функцию Максимум (MAX). Поскольку для большинства бизнес-задач значение строки в рамках одной детальной записи уникально, функция Максимум вернет именно этот текст.

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

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


// Регистрируем поле как ресурс с функцией агрегации
УниверсальныйОтчет.ДобавитьПолеРесурс("Строка2233", "Максимум(Строка2233)");

// Добавляем этот ресурс в список доступных показателей отчета
УниверсальныйОтчет.ДобавитьПоказатель("Строка2233", "Дополнительная информация", Истина, "ЧЦ=15; ЧДЦ=2", "ДополнительнаяИнформация", "Информация");

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

Решение 2: Использование Дополнительных полей

Если вы не хотите превращать строку в ресурс (например, если логика отчета предполагает сложную иерархию), можно воспользоваться механизмом Дополнительных полей. Рассмотрим, как это работает.

Метод УниверсальныйОтчет.ДобавитьДополнительноеПоле позволяет привязать вывод поля к конкретной группировке. Однако здесь есть «подводный камень»: чтобы поле отобразилось без детальных записей, в настройках компоновки данных необходимо указать способ размещения дополнительных полей.

Проанализируем программную настройку:


// Добавляем поле в категорию дополнительных
УниверсальныйОтчет.ДобавитьДополнительноеПоле("Строка2233", "Дополнительная информация", "ДополнительнаяИнформация");

После этого в пользовательском режиме (или программно в настройках по умолчанию) нужно убедиться, что выбран вариант размещения В отдельных колонках. Если выбрано размещение «В одной колонке с группировкой», строка будет выводиться в скобках рядом с названием группировки (например: «Контрагент (г. Москва)»).

Решение 3: Ограничение длины строки (ВЫРАЗИТЬ)

Выясним еще одну техническую причину, по которой Максимум может не срабатывать. В 1С (и в SQL) функции агрегации MAX и MIN могут некорректно работать со строками неограниченной длины. Если ваше поле в конфигурации имеет тип «Строка (0)», агрегация может быть заблокирована на уровне СУБД.

Чтобы избежать этой проблемы, в самом тексте запроса, который передается в Универсальный отчет, следует явно ограничить длину строки. Рассмотрим пример корректировки запроса:


ВЫБРАТЬ
    Рег.Контрагент КАК Контрагент,
    ВЫРАЗИТЬ(Рег.Комментарий КАК СТРОКА(200)) КАК Строка2233
ИЗ
    РегистрСведений.МойРегистр КАК Рег

Такой подход гарантирует, что тип данных станет фиксированным, и функция Максимум(Строка2233) отработает корректно даже на уровне группировок без вывода детальных записей.

Как бороться с пустыми строками?

Часто пользователь жалуется: «Если включить детальные записи, появляются пустые строки». Это происходит потому, что в регистре могут быть записи, где измерения заполнены, а искомый ресурс — нет. Чтобы «схлопнуть» отчет и видеть только полезную информацию, мы рекомендуем использовать Отбор.

В настройках отчета (или программно через УниверсальныйОтчет.ДобавитьОтбор) установите условие: Строка2233 Заполнено. Это отсечет все записи, которые не несут смысловой нагрузки в данном контексте, и отчет станет гораздо компактнее.

Подведем итоги

Для того чтобы вывести строковое поле в «Универсальном отчете» без детальных записей, выполним следующие шаги:

  1. Убедимся, что в исходном запросе поле имеет ограниченную длину (используем ВЫРАЗИТЬ).
  2. Добавим поле как ресурс через ДобавитьПолеРесурс, обязательно указав выражение Максимум(ИмяПоля).
  3. Добавим этот ресурс в показатели отчета методом ДобавитьПоказатель.
  4. Проверим соответствие имен полей в коде и в схеме запроса, чтобы избежать ошибок инициализации.

Следуя этим рекомендациям, мы получим чистый и профессиональный отчет, где справочная информация выводится в одной строке с итоговыми показателями по группировкам.

← На главную