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