Создание аналитических отчетов по демографическим данным — одна из классических задач при разработке на платформе 1С:Предприятие. В данной статье мы разберем, как построить отчет в Системе компоновки данных (СКД), который позволит не просто вывести список детей, но и сгруппировать их по полу и конкретным возрастным категориям (например, 1–6 лет, 7–9 лет и так далее).
Начнем с разработки текста запроса. Нам необходимо извлечь данные из справочника, где хранится информация о детях (в типовых решениях это часто справочник ФизическиеЛица). Для того чтобы отчет был читаемым, мы заменим технические значения перечислений на понятные текстовые названия.
Рассмотрим пример построения логики для определения пола в запросе:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ребенок,
ВЫБОР
КОГДА ФизическиеЛица.Пол = ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Мужской)
ТОГДА "Мальчики"
ИНАЧЕ "Девочки"
КОНЕЦ КАК ПолТекстом,
ФизическиеЛица.ДатаРождения КАК ДатаРождения
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
НЕ ФизическиеЛица.ЭтоГруппа
В этом фрагменте мы используем конструкцию ВЫБОР КОГДА, чтобы преобразовать системное значение перечисления в дружелюбный для пользователя текст. Это позволит нам в дальнейшем использовать поле ПолТекстом в качестве группировки в настройках СКД.
Одной из самых сложных задач является корректное вычисление возраста. Часто новички используют функцию РАЗНОСТЬДАТ(..., ГОД), однако проанализируем ситуацию: эта функция считает количество пересечений границ года (31 декабря/1 января). Если ребенок родился 31 декабря, а отчет формируется 1 января следующего года, функция вернет 1 год, хотя фактически ребенку всего один день.
Для точного расчета в запросе или в вычисляемых полях СКД лучше использовать более сложную логику, учитывающую месяц и день рождения. Рассмотрим вариант реализации возрастных групп прямо в тексте запроса:
ВЫБРАТЬ
ВЫБОР
КОГДА РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &ТекущаяДата, ГОД) МЕЖДУ 1 И 6
ТОГДА "Группа 1-6 лет"
КОГДА РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &ТекущаяДата, ГОД) МЕЖДУ 7 И 9
ТОГДА "Группа 7-9 лет"
КОГДА РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &ТекущаяДата, ГОД) МЕЖДУ 10 И 12
ТОГДА "Группа 10-12 лет"
ИНАЧЕ "Другие"
КОНЕЦ КАК ВозрастнаяГруппа
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
Выясним причину, по которой стоит обратить внимание на точность: если для статистики по школам погрешность в несколько дней не критична, то для формирования групп в детских садах это может быть принципиально. Для максимально точного вычисления (до дня) рекомендуем использовать вычисляемые поля в СКД с выражением, которое проверяет, наступил ли уже день рождения в текущем году.
После того как мы определили поля для группировки, нам нужно настроить суммирование данных. Разберем по шагам, как это сделать в закладке Ресурсы конструктора СКД:
Ссылка).Количество(Ссылка) или Количество(Различные Ссылка).Количество(Различные Ссылка) предпочтительнее, так как оно исключает дублирование записей, если в запросе по какой-то причине возникнет задвоение данных.Многие задаются вопросом: можно ли использовать Сумма(1)? Это допустимо, если в самом запросе вы добавили поле-константу, но вариант с Количество(Различные Ссылка) считается более надежным и понятным для других разработчиков, которые будут поддерживать ваш отчет.
Посмотрим на пример того, как сделать запрос чище. Вместо того чтобы загромождать его условиями ВЫБОР КОГДА, мы можем вынести расчет возрастной группы на уровень Вычисляемых полей СКД. Это позволит нам динамически менять границы групп, не залезая в основной текст запроса.
Пример выражения для точного возраста в вычисляемом поле:
ВЫБОР КОГДА ДобавитьКДате(ДатаРождения, "ГОД", РазностьДат(ДатаРождения, &ТекущаяДата, "ГОД")) > &ТекущаяДата ТОГДА РазностьДат(ДатаРождения, &ТекущаяДата, "ГОД") - 1 ИНАЧЕ РазностьДат(ДатаРождения, &ТекущаяДата, "ГОД") КОНЕЦ
Затем создается еще одно вычисляемое поле ВозрастнаяГруппа, которое использует результат первого поля для определения категории.
Чтобы отчет выглядел профессионально и был удобен для анализа, проанализируем настройки структуры на закладке Настройки в СКД. Для нашей задачи идеально подходит тип Кросс-таблица:
ВозрастнаяГруппа.ПолТекстом.Количество.В результате вы получите компактную и наглядную матрицу, где в строках будут указаны возрастные категории, в колонках — пол, а на их пересечении — итоговое количество детей. Дополнительно можно добавить группировку по полю Школа в самый верх иерархии строк, чтобы видеть статистику в разрезе каждого учебного заведения.
Рассмотрим подробнее важный нюанс — отсутствие данных. В реальных базах часто встречаются записи с незаполненной датой рождения. В 1С пустая дата соответствует значению 0001-01-01. Если не обработать этот момент, такие записи попадут в некорректную возрастную группу или вызовут ошибку расчета.
Рекомендуем всегда добавлять проверку в начало ваших условий:
ВЫБОР
КОГДА ДатаРождения = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА "Дата не указана"
... далее остальные условия ...
КОНЕЦ
Такой подход гарантирует, что ваш отчет будет работать стабильно даже при наличии неполных данных в справочниках.