При разработке отчетов и обработок в платформе 1С часто возникает задача определения полного возраста сотрудников на текущую дату или на определенный период. Рассмотрим, как правильно реализовать этот расчет в языке запросов и схеме компоновки данных (СКД), а также разберем распространенные ошибки и нюансы работы с функциями дат.
Самый простой вариант решения — использование встроенной функции языка запросов 1С РАЗНОСТЬДАТ. Она принимает три параметра: начальную дату, конечную дату и тип разности.
Рассмотрим пример конструкции запроса:
РАЗНОСТЬДАТ(Сотрудники.ФизическоеЛицо.ДатаРождения, &Период, ГОД)
Важная особенность: Функция РАЗНОСТЬДАТ с типом ГОД подсчитывает количество пройденных календарных границ года. Это означает, что для дат 31.12.2023 и 01.01.2024 функция вернет значение 1, хотя фактически прошел только один день, и полный год еще не исполнился. Если вам требуется точный расчет прожитых лет с учетом месяца и дня рождения, рекомендуется использовать второй способ.
Чтобы корректно вычислить возраст сотрудника и не завысить результат до наступления дня рождения в текущем году, разберем более точную формулу. Вычтем разницу лет и проверим, наступил ли уже день рождения в расчётном периоде.
Проанализируем следующий пример запроса:
ВЫБОР
КОГДА Сотрудники.ФизическоеЛицо.ДатаРождения ЕСТЬ NULL
ИЛИ Сотрудники.ФизическоеЛицо.ДатаРождения = ДАТАВРЕМЯ(1, 1, 1)
ИЛИ Сотрудники.ФизическоеЛицо.ДатаРождения > &Период
ТОГДА 0
ИНАЧЕ ГОД(&Период) - ГОД(Сотрудники.ФизическоеЛицо.ДатаРождения)
+ ВЫБОР
КОГДА МЕСЯЦ(Сотрудники.ФизическоеЛицо.ДатаРождения) * 100 + ДЕНЬ(Сотрудники.ФизическоеЛицо.ДатаРождения) > МЕСЯЦ(&Период) * 100 + ДЕНЬ(&Период)
ТОГДА -1
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ
В этой формуле мы:
NULL или пустая дата 0001-01-01), а также проверяем, не превышает ли дата рождения заданный период.Для того чтобы расчет выполнялся на текущую дату или выбранную пользователем дату отчета, необходимо настроить параметр &Период в схеме компоновки данных.
Выполним следующие шаги по настройке СКД:
Период. В поле Выражение зададим функцию ТекущаяДата(), чтобы по умолчанию отчет строился на текущий момент.Если отчет вызывается программно из кода 1С, передачу параметра можно выполнить следующей конструкцией:
Запрос.УстановитьПараметр("Период", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
Часто разработчики сталкиваются с ошибкой синтаксиса при вычислении возраста во вкладке Вычисляемые поля СКД. Выясним причину разницы в синтаксисе:
РАЗНОСТЬДАТ(Дата1, Дата2, ГОД).РазностьДат(Дата1, &Период, "Год").Учитывая эти различия синтаксиса, вы сможете избежать ошибок при формировании вычисляемых полей и получить точный возраст сотрудника в отчете.