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