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