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