При работе с инструментом Универсальный отчет разработчики часто сталкиваются с ситуацией, когда необходимо вывести текстовую информацию (например, комментарий, адрес или дополнительную информацию из регистра) в отдельной колонке на уровне группировок. По умолчанию система компоновки данных (СКД), на которой базируется отчет, выводит детальные текстовые поля только при включении режима Детальные записи. Однако это приводит к появлению лишних «пустых» строк и избыточности данных.
В этой статье мы подробно разберем, как заставить систему отображать строковые данные на уровне итогов и группировок, не прибегая к выводу каждой отдельной записи. Мы проанализируем механизмы работы ресурсов и выясним, почему стандартное добавление показателя через УниверсальныйОтчет.ДобавитьПоказатель не всегда дает нужный результат.
Основная причина кроется в архитектуре СКД. Когда мы отключаем детальные записи, отчет переходит в режим отображения группировок. Для каждой группировки система должна решить, какое именно значение показать в колонке, если записей внутри группы несколько. Для числовых данных это решается суммированием, а для строк — нет. Если поле не объявлено ресурсом или не включено в поля группировки, СКД просто игнорирует его на верхних уровнях иерархии.
Самый эффективный способ вывести строку в колонку итогов — это объявить её ресурсом и использовать функцию Максимум (MAX). Поскольку для большинства бизнес-задач значение строки в рамках одной детальной записи уникально, функция Максимум вернет именно этот текст.
Рассмотрим по шагам, как это реализовать программно в модуле отчета. Предположим, у нас есть поле Строка2233, которое является ресурсом регистра сведений.
Сначала нам нужно зарегистрировать это поле как ресурс в схеме компоновки. Если мы просто добавим показатель, система не поймет, как его агрегировать. Используем следующий код:
// Регистрируем поле как ресурс с функцией агрегации
УниверсальныйОтчет.ДобавитьПолеРесурс("Строка2233", "Максимум(Строка2233)");
// Добавляем этот ресурс в список доступных показателей отчета
УниверсальныйОтчет.ДобавитьПоказатель("Строка2233", "Дополнительная информация", Истина, "ЧЦ=15; ЧДЦ=2", "ДополнительнаяИнформация", "Информация");
Важный нюанс: Обратите внимание на именование. В сообщениях форума предлагалось использовать псевдонимы типа Строка2233_1. Однако, если вы создаете псевдоним, которого нет в исходном запросе СКД, система может выдать ошибку «Поле не найдено». Рекомендуется использовать оригинальное имя поля из запроса для обеспечения прямой связи.
Если вы не хотите превращать строку в ресурс (например, если логика отчета предполагает сложную иерархию), можно воспользоваться механизмом Дополнительных полей. Рассмотрим, как это работает.
Метод УниверсальныйОтчет.ДобавитьДополнительноеПоле позволяет привязать вывод поля к конкретной группировке. Однако здесь есть «подводный камень»: чтобы поле отобразилось без детальных записей, в настройках компоновки данных необходимо указать способ размещения дополнительных полей.
Проанализируем программную настройку:
// Добавляем поле в категорию дополнительных
УниверсальныйОтчет.ДобавитьДополнительноеПоле("Строка2233", "Дополнительная информация", "ДополнительнаяИнформация");
После этого в пользовательском режиме (или программно в настройках по умолчанию) нужно убедиться, что выбран вариант размещения В отдельных колонках. Если выбрано размещение «В одной колонке с группировкой», строка будет выводиться в скобках рядом с названием группировки (например: «Контрагент (г. Москва)»).
Выясним еще одну техническую причину, по которой Максимум может не срабатывать. В 1С (и в SQL) функции агрегации MAX и MIN могут некорректно работать со строками неограниченной длины. Если ваше поле в конфигурации имеет тип «Строка (0)», агрегация может быть заблокирована на уровне СУБД.
Чтобы избежать этой проблемы, в самом тексте запроса, который передается в Универсальный отчет, следует явно ограничить длину строки. Рассмотрим пример корректировки запроса:
ВЫБРАТЬ
Рег.Контрагент КАК Контрагент,
ВЫРАЗИТЬ(Рег.Комментарий КАК СТРОКА(200)) КАК Строка2233
ИЗ
РегистрСведений.МойРегистр КАК Рег
Такой подход гарантирует, что тип данных станет фиксированным, и функция Максимум(Строка2233) отработает корректно даже на уровне группировок без вывода детальных записей.
Часто пользователь жалуется: «Если включить детальные записи, появляются пустые строки». Это происходит потому, что в регистре могут быть записи, где измерения заполнены, а искомый ресурс — нет. Чтобы «схлопнуть» отчет и видеть только полезную информацию, мы рекомендуем использовать Отбор.
В настройках отчета (или программно через УниверсальныйОтчет.ДобавитьОтбор) установите условие: Строка2233 Заполнено. Это отсечет все записи, которые не несут смысловой нагрузки в данном контексте, и отчет станет гораздо компактнее.
Для того чтобы вывести строковое поле в «Универсальном отчете» без детальных записей, выполним следующие шаги:
ВЫРАЗИТЬ).ДобавитьПолеРесурс, обязательно указав выражение Максимум(ИмяПоля).ДобавитьПоказатель.Следуя этим рекомендациям, мы получим чистый и профессиональный отчет, где справочная информация выводится в одной строке с итоговыми показателями по группировкам.