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