При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда необходимо вывести строковое поле (например, список адресов или состав заказа) в детальных записях, используя функции агрегации вроде СоединитьСтроки. Чтобы избежать ошибок компоновки и обеспечить доступность поля во всех частях отчета, такое поле часто добавляют в список ресурсов. Однако это приводит к нежелательному побочному эффекту: в строке «Общий итог» система пытается агрегировать эти данные, создавая громоздкие и бессмысленные текстовые блоки. Ситуация осложняется, если отчет строится только по «Детальным записям», так как стандартный механизм ограничения расчета «Рассчитывать по...» требует наличия конкретных группировок.
В этой статье мы подробно разберем несколько проверенных методов решения этой задачи, проанализируем причины возникновения проблемы и выберем оптимальный подход для каждого случая.
Рассмотрим самый простой визуальный способ, который не требует изменения структуры запроса или сложной настройки ресурсов. Мы можем оставить расчет итогов как есть, но просто скрыть результат от пользователя.
Для этого выполним следующие шаги:
Адрес), которое не должно отображаться в итогах.Этот метод хорош тем, что он «безопасен»: вы не сломаете логику компоновки, а просто очистите визуальное представление отчета.
Разберем более «правильный» с точки зрения архитектуры СКД подход. Система позволяет гибко настраивать выражения ресурсов для различных уровней отчета. Если нам нужно значение в детальных записях, но не в итогах, мы можем воспользоваться настройкой полей расчета.
Проанализируем ситуацию: когда мы добавляем поле в ресурсы, СКД по умолчанию рассчитывает его для всех доступных уровней. Мы можем переопределить это поведение на закладке Ресурсы:
// В первой строке для поля "Адрес"
Выражение: СоединитьСтроки(Адрес)
Рассчитывать по: [Здесь укажите все ваши группировки, кроме Общего итога]
// Во второй строке для того же поля "Адрес"
Выражение: "" (пустая строка)
Рассчитывать по: ОбщийИтог
Однако, если у вас в настройках используются только Детальные записи, вы не сможете выбрать их в колонке Рассчитывать по. В этом случае данный метод трансформируется в создание фиктивной группировки, что мы рассмотрим далее.
Выясним причину, почему в детальных записях сложнее управлять итогами. В СКД Детальные записи — это вывод сырых данных без агрегации. Если же мы превратим их в группировку, нам откроются дополнительные возможности управления ресурсами.
Посмотрим на алгоритм действий:
Адрес в колонке Рассчитывать по... мы сможем выбрать нашу новую группировку.Если же ошибка «Поле не найдено» сохраняется, попробуйте указать в группировке все измерения документа. Это заставит СКД однозначно определить контекст вычисления ресурса.
Рассмотрим ситуацию, когда использование ресурсов вообще не является обязательным. Часто программисты делают поле ресурсом только ради функции СоединитьСтроки. Мы можем реализовать аналогичную логику непосредственно в тексте запроса или использовать временные таблицы.
Если данные попадают в СКД уже подготовленными (строка адресов сформирована заранее в коде или вложенным запросом), нам достаточно вывести это поле как обычное поле набора данных. В этом случае:
Проанализируем продвинутый способ манипуляции выражениями. На закладке Ресурсы можно добавить две записи для одного и того же поля:
СоединитьСтроки(Адрес), поле Рассчитывать по оставить пустым (это значит рассчитывать везде)."" (пустые кавычки), поле Рассчитывать по установить в значение ОбщийИтог.Важно: СКД приоритезирует более специфичные правила расчета. Правило для ОбщийИтог является более узким, чем общее правило, поэтому в подвале отчета система выведет пустую строку, проигнорировав основную формулу агрегации.
Иногда корень проблемы кроется в неправильно назначенных ролях в наборе данных. Если поле адреса имеет связи или роли, навязанные системой автоматически, СКД может требовать его агрегации.
Попробуем проверить вкладку Набор данных:
Адрес.Если в вашем отчете вообще не требуются итоги ни по одному полю, мы можем отключить их глобально. Это самый быстрый способ, если отчет носит чисто информационный характер (реестр).
Разберем шаги:
В этом случае строка итогов просто исчезнет из выходной формы, и проблема с суммированием строк перестанет быть актуальной.
Резюме: Для большинства задач оптимальным является Метод 1 (Условное оформление) благодаря своей простоте, либо Метод 5 (Пустое выражение для итогов), если вы хотите решить задачу на уровне логики ресурсов, не меняя визуальные настройки оформления.