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