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