Как в СКД объединить данные из разных документов и сгруппировать их по периодам

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

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

В этой статье мы подробно разберем, почему стандартное соединение таблиц через ГДЕ или СОЕДИНЕНИЕ не подходит для этой задачи, и как правильно настроить схему компоновки данных для получения красивого и точного отчета.

Анализ проблемы: почему данные «разъезжаются»

Рассмотрим типичную ошибку начинающего разработчика. Пытаясь собрать данные из четырех документов, часто используют левое или полное соединение. Проанализируем ситуацию: если за определенный месяц у пользователя был документ ПриемНаРаботу, но не было документа Увольнение, то при внутреннем соединении вся строка пропадет из отчета. При использовании левых соединений возникает другая проблема — «размножение» записей (декартово произведение), когда количество приемов умножается на количество отпусков, и итоговые цифры становятся неверными.

Вторая проблема — группировка. Если использовать в запросе поле Дата в исходном виде, то СКД не сможет объединить записи, так как время у документов разное (с точностью до секунды). В итоге вместо одной строки за «Январь 2025» мы получаем десятки строк на каждую дату документа.

Шаг 1: Правильная структура запроса с «ОБЪЕДИНИТЬ ВСЕ»

Для решения задачи нам необходимо использовать оператор ОБЪЕДИНИТЬ ВСЕ. Мы создадим запрос, который «складывает» данные из разных таблиц в одну стопку, выравнивая их по колонкам. Выясним причину, по которой это важно: каждый документ поставляет данные только в свою колонку-показатель, оставляя остальные нулевыми.

Разберем пример структуры запроса:


ВЫБРАТЬ
    Прием.Ответственный КАК Ответственный,
    НАЧАЛОПЕРИОДА(Прием.Дата, МЕСЯЦ) КАК Период,
    1 КАК ПриемНаРаботу,
    0 КАК Увольнение,
    0 КАК КадровыйПеревод,
    0 КАК Отпуск
ИЗ
    Документ.ПриемНаРаботу КАК Прием
ГДЕ
    Прием.Проведен
    И Прием.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

ВЫБРАТЬ
    Увольнение.Ответственный,
    НАЧАЛОПЕРИОДА(Увольнение.Дата, МЕСЯЦ),
    0,
    1,
    0,
    0
ИЗ
    Документ.Увольнение КАК Увольнение
ГДЕ
    Увольнение.Проведен
    И Увольнение.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

ВЫБРАТЬ
    Перевод.Ответственный,
    НАЧАЛОПЕРИОДА(Перевод.Дата, МЕСЯЦ),
    0,
    0,
    1,
    0
ИЗ
    Документ.КадровыйПеревод КАК Перевод
ГДЕ
    Перевод.Проведен
    И Перевод.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Обратите внимание на использование функции НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ). Это ключевой момент, который позволяет нам привести все разнородные даты к единому значению — первому числу месяца. Именно по этому полю в дальнейшем произойдет «схлопывание» строк.

Шаг 2: Настройка ресурсов в СКД

После того как запрос написан, необходимо объяснить системе компоновки данных, что поля «ПриемНаРаботу», «Увольнение» и другие являются числовыми показателями, которые нужно суммировать. Если этого не сделать, система будет выводить единицы в каждой строке без агрегации.

Перейдем на закладку Ресурсы и выполним следующие действия:

  1. Добавим поле ПриемНаРаботу в список ресурсов. В колонке «Выражение» укажем СУММА(ПриемНаРаботу).
  2. Аналогично добавим Увольнение, КадровыйПеревод и Отпуск.
  3. В колонке «Рассчитывать по...» можно оставить пустое значение, чтобы ресурсы рассчитывались по всем группировкам отчета.

Теперь СКД понимает, что при совпадении Ответственного и Периода значения в этих колонках должны складываться.

Шаг 3: Настройка группировок в отчете

Проанализируем структуру настроек на закладке Настройки. Ошибка многих пользователей заключается в том, что они пытаются вывести детальные записи. Нам же нужна четкая иерархия.

Рассмотрим правильную последовательность настройки:

  1. Создадим группировку по полю Ответственный (или ФИО пользователя).
  2. Внутри нее создадим вложенную группировку по полю Период.
  3. На закладке Выбранные поля для всего отчета выберем наши ресурсы: ПриемНаРаботу, Увольнение, КадровыйПеревод, Отпуск.

Важный нюанс: В настройках группировки по полю Период убедитесь, что в выбранных полях стоит Авто или явно указаны ресурсы. Если вы добавите в группировку поле Дата (секундное), данные снова «разъедутся».

Шаг 4: Визуальное оформление периода

Чтобы в отчете вместо даты 01.01.2025 00:00:00 пользователь видел понятное Январь 2025, настроим формат поля. Посмотрим на вкладку Наборы данных.

Найдем наше поле Период и в колонке Оформление нажмем кнопку выбора. В открывшемся окне установим параметр Формат. Используем строку формата ДФ='ММММ гггг'. Это обеспечит вывод названия месяца и года в привычном виде.

Дополнительные рекомендации для профессиональной разработки

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

Также стоит обратить внимание на роль поля Период на вкладке Наборы данных. Установите для него роль «Период» с типом «Дополнительный». Это позволит СКД корректно работать со стандартными периодами и обеспечит правильную сортировку по времени, а не по алфавиту названий месяцев.

Подведем итог: использование UNION ALL вместе с НАЧАЛОПЕРИОДА в запросе и настройка Ресурсов в СКД — это надежный и производительный способ объединения информации из разных источников в один аналитический отчет.

← На главную