При построении кросс-таблиц (таблиц СКД) разработчики часто сталкиваются с задачей, когда на пересечении строк и колонок необходимо вывести не просто числовые показатели (такие как количество или сумма), а текстовую информацию. Например, это может быть номер заказа, артикул номенклатуры, текстовый комментарий или статус документа. По умолчанию Система компоновки данных (СКД) игнорирует такие поля в области пересечения, оставляя ячейки пустыми. Разберем детально, почему так происходит, и как решить эту проблему несколькими способами.
В Системе компоновки данных кросс-таблицы работают по строгим математическим законам агрегации. На пересечении строк (например, ЗаказНаПроизводство) и колонок (например, Дата) СКД пытается вывести только ресурсы. Обычные группировочные или реквизитные поля, не объявленные как ресурсы, система обработать в этой области не может.
По умолчанию СКД предлагает сделать ресурсами только числовые поля (Количество, Сумма и т.д.). Текстовые или ссылочные поля (такие как Номер) автоматически ресурсами не становятся. Если мы просто перетащим такое поле в выбранные поля таблицы, СКД не поймет, как его сгруппировать, и ячейка останется пустой.
Кроме того, здесь важную роль играет платформа и тип используемых форм. На Управляемых формах (УФ) в платформе 8.3 используется более современный процессор вывода отчетов. Он умеет "на лету" корректировать мелкие ошибки настройки и неявное дублирование полей. На Обычных формах (или при использовании старого процессора вывода) СКД крайне чувствительна к настройкам иерархии и при любом конфликте просто скрывает данные.
Рассмотрим самый частый случай, когда настройки на верхних уровнях структуры ломают логику вывода детальных записей. В СКД действует жесткое правило наследования параметров сверху вниз: настройки выбранных полей с уровня "Отчет" автоматически переходят на уровень "Таблица", а оттуда — на группировки строк и колонок.
Если мы добавим нересурсное поле Номер в "Выбранные поля" на уровне всего отчета или таблицы, СКД попытается спроецировать его на все ячейки кросс-таблицы, что приведет к конфликту компоновщика.
Для решения проблемы выполним следующие шаги:
Заказ). В ее локальных "Выбранных полях" укажем только те поля, которые должны выводиться в строках: само поле Заказ и ресурс Количество.Дата). В ее локальных "Выбранных полях" укажем только поле Дата.Разрывая глобальное наследование выбранных полей и настраивая каждую группировку локально, мы изолируем логику вывода. СКД корректно сопоставит структуру данных и выведет информацию без конфликтов.
Если нам необходимо вывести строковое поле (например, НомерЗаказа) именно в самом перекрестье (в ячейках пересечения строк и колонок), его обязательно нужно сделать ресурсом. Но так как суммировать строки нельзя, мы должны использовать другие агрегатные функции.
Разберем, как правильно настроить такое поле на вкладке "Ресурсы":
Номер) в список ресурсов.Если гарантировано, что на одну ячейку (пересечение конкретной строки и колонки) приходится только один документ, используем функции выбора экстремума:
Максимум(Номер)
или
Минимум(Номер)
Если же на пересечении строки и колонки может оказаться несколько различных документов, и нам нужно вывести номера их всех, идеальным решением будет использование функции СоединитьСтроки. Запишем выражение следующим образом:
СоединитьСтроки(Номер, ", ")
Эта функция соберет все номера заказов, попавшие в данную точку пересечения, и выведет их в виде одной строки, разделенной запятыми. После этого поле станет полноценным ресурсом и без проблем отобразится в перекрестье кросс-таблицы.
Проанализируем ситуации, когда стандартные возможности группировок СКД не позволяют добиться требуемого визуального оформления, и выясним, какие обходные пути используют профессиональные разработчики.
Использование собственных макетов оформления. Если нам нужно не просто вывести строковое значение, а задать для него особый формат (например, добавить статический префикс, изменить шрифт или цвет фона ячейки в зависимости от условий), мы можем использовать вкладку "Макеты". Создав собственный макет для поля или макет группировки, мы получаем полный контроль над выводом ячеек в результирующий табличный документ, полностью обходя стандартные ограничения кросс-таблиц.
Создание вспомогательного вычисляемого поля. Иногда требуется визуально "пристыковать" текстовую колонку к кросс-таблице без превращения ее в полноценный ресурс. Для этого мы можем создать вычисляемое поле с пустым выражением:
""
Затем мы добавляем это фиктивное поле в структуру группировки колонок рядом с основными колонками, а в выбранные поля этой фиктивной группировки выводим нужные нам текстовые данные. Визуально это будет выглядеть как дополнительная колонка в таблице, хотя технически она не будет являться ресурсом перекрестья.
Применяя данные подходы, мы можем гибко управлять выводом любой текстовой и ссылочной информации в сложных кросс-таблицах СКД, обеспечивая пользователям максимально информативные и понятные отчеты.