Как создать кросс-таблицу в 1С СКД с произвольными строками и подсчетом количества?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с задачей вывода сложных аналитических таблиц — кросс-таблиц. Особую сложность вызывают ситуации, когда в строках отчета необходимо вывести фиксированный (статический) набор состояний или точек маршрута бизнес-процесса, даже если в текущий момент времени по некоторым из них нет никаких данных в информационной базе.

В этой статье мы подробно разберем, как спроектировать такой отчет. Мы научимся объединять разнородные данные (нестартованные бизнес-процессы и активные задачи на точках маршрута), формировать «виртуальные» строки прямо в запросе, настраивать структуру кросс-таблицы в СКД и заменять пустые ячейки красивыми нулями.

Давайте по шагам разберем весь процесс реализации этой задачи.


Шаг 1. Формирование источника данных в запросе

Основная сложность задачи автора заключается в том, что строки отчета должны содержать фиксированные состояния: «Не стартован», «Точка 1» и «Точка 2». Если просто выбрать данные из таблиц задач, то состояния, по которым сейчас нет активных задач, вообще не попадут в результат запроса и, соответственно, пропадут из отчета.

Чтобы решить эту проблему, мы применим прием создания виртуальной таблицы-пустышки с помощью оператора ОБЪЕДИНИТЬ ВСЕ. Это гарантирует, что наши фиксированные строки всегда будут присутствовать в результирующей таблице.

Рассмотрим структуру нашего запроса подробнее:


// 1. Получаем нестартованные бизнес-процессы
ВЫБРАТЬ
    БП.Договор.Организация КАК Организация,
    БП.Договор КАК Договор,
    "Не стартован" КАК Состояние
ИЗ
    БизнесПроцесс.МойБизнесПроцесс КАК БП
ГДЕ
    БП.Стартован = ЛОЖЬ
    И БП.ПометкаУдаления = ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

// 2. Получаем задачи на нужных точках маршрута
ВЫБРАТЬ
    Задача.БизнесПроцесс.Договор.Организация,
    Задача.БизнесПроцесс.Договор,
    ВЫБОР
        КОГДА Задача.ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.МойБизнесПроцесс.Points.Точка1) ТОГДА "Точка 1"
        КОГДА Задача.ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.МойБизнесПроцесс.Points.Точка2) ТОГДА "Точка 2"
    КОНЕЦ
ИЗ
    Задача.МояЗадача КАК Задача
ГДЕ
    Задача.Выполнена = ЛОЖЬ
    И Задача.ТочкаМаршрута В (
        ЗНАЧЕНИЕ(БизнесПроцесс.МойБизнесПроцесс.Points.Точка1),
        ЗНАЧЕНИЕ(БизнесПроцесс.МойБизнесПроцесс.Points.Точка2)
    )

ОБЪЕДИНИТЬ ВСЕ

// 3. Гарантированный вывод фиксированных строк (строки-пустышки)
ВЫБРАТЬ NULL, NULL, "Не стартован"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ NULL, NULL, "Точка 1"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ NULL, NULL, "Точка 2"

Проанализируем, что мы сделали в этом запросе:

  1. Первый пакет объединения выбирает все договоры и их организации из бизнес-процессов, которые еще не были стартованы. Мы жестко присваиваем им текстовое состояние "Не стартован".
  2. Второй пакет объединения выбирает активные (невыполненные) задачи. С помощью конструкции ВЫБОР КОГДА мы сопоставляем конкретные точки маршрута бизнес-процесса с текстовыми названиями строк нашего будущего отчета.
  3. Третий пакет объединения — это важнейшая деталь. Мы вручную добавляем строки, где поля Организация и Договор равны NULL, но при этом заполнено поле Состояние. Это гарантирует, что даже при полном отсутствии задач или бизнес-процессов в базе данных, строки «Не стартован», «Точка 1» и «Точка 2» все равно отобразятся в нашей кросс-таблице.

Шаг 2. Определение ресурсов СКД

Для того чтобы система компоновки данных могла рассчитать количество договоров на пересечении строк и колонок, нам необходимо настроить ресурсы.

Перейдем на вкладку «Ресурсы» в схеме компоновки данных:

  1. Найдем в списке доступных полей наше поле Договор.
  2. Перенесем его в табличную часть ресурсов.
  3. В колонке «Выражение» укажем агрегатную функцию: Количество(Различные Договор). Это позволит нам корректно подсчитывать число уникальных договоров, избегая дублирования при расчетах.

Шаг 3. Настройка структуры отчета (Создание кросс-таблицы)

Теперь перейдем к визуальной настройке нашего отчета. Разберем по шагам, как создать именно кросс-таблицу в интерфейсе настройки СКД:

  1. Перейдем на вкладку «Настройки» (в нижней части конструктора СКД).
  2. В окне «Структура» по умолчанию может быть создана группировка «Детальные записи». Нажмите на нее правой кнопкой мыши и удалите.
  3. Нажмите правой кнопкой мыши на самый верхний элемент дерева — «Отчет».
  4. В контекстном меню выберите пункт «Добавить таблицу» (обратите внимание, нужно выбрать именно «Таблицу», а не обычную группировку).
  5. В структуре отчета появится элемент «Таблица», внутри которого будут две ветки: «Строки» и «Колонки».
  6. Нажмите правой кнопкой мыши на ветку «Строки», выберите «Добавить группировку» и укажите наше поле Состояние.
  7. Нажмите правой кнопкой мыши на ветку «Колонки», выберите «Добавить группировку» и укажите поле Организация.
  8. Перейдите на вкладку «Выбранные поля» внизу окна настроек и добавьте туда наш ресурс — поле Договор.

Благодаря этой структуре СКД автоматически сгруппирует все уникальные значения поля Организация в заголовки колонок, а значения поля Состояние — в строки. На пересечении будет автоматически выведено количество договоров.


Шаг 4. Фильтрация пустых колонок и оформление нулей

Поскольку в первом шаге мы использовали «строки-пустышки» со значениями NULL в полях организации, в нашей таблице может появиться пустая колонка с заголовком «Пусто» (или без названия). Нам необходимо скрыть ее, не нарушая при этом целостность строк.

Как убрать пустую колонку организации:

  1. В окне структуры настроек выберите группировку колонок Организация.
  2. В нижней части настроек перейдите на вкладку «Отбор».
  3. Добавьте новое условие отбора: Организация Заполнено (или Организация НЕ РАВНО NULL).

Так как этот отбор накладывается непосредственно на группировку колонок, он скроет только пустую колонку организации. Сами строки при этом не пострадают и останутся в отчете.

Как вывести «0» вместо пустых ячеек:

По умолчанию СКД оставляет ячейки пустыми, если на пересечении строки и колонки нет данных. Для придания отчету профессионального вида настроим вывод нулей:

  1. В настройках отчета (выделив корневой элемент «Отчет» в структуре) перейдем на вкладку «Условное оформление».
  2. Добавим новое правило оформления.
  3. На вкладке «Оформление» найдем свойство «Текст» и укажем значение 0 (или строку "0").
  4. На вкладке «Условие» добавим элемент условия: Договор Не заполнено (или Договор РАВНО NULL).
  5. На вкладке «Оформляемые поля» выберем наше поле-ресурс Договор.

Теперь на пересечении строк состояний и колонок организаций всегда будет выводиться понятное числовое значение, а пустые ячейки заменятся аккуратными нулями.


Заключение

Мы детально рассмотрели процесс проектирования кросс-таблицы в системе компоновки данных 1С. Объединив возможности языка запросов (использование виртуальных строк-пустышек через ОБЪЕДИНИТЬ ВСЕ) и мощные механизмы вывода таблиц в СКД, мы получили гибкий и отказоустойчивый отчет, который сохраняет свою структуру вне зависимости от наличия данных в информационной базе.

← На главную