Как рассчитать полное количество лет (возраст) сотрудника в запросе и СКД 1С?

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

При разработке отчетов и обработок в платформе 1С часто возникает задача определения полного возраста сотрудников на текущую дату или на определенный период. Рассмотрим, как правильно реализовать этот расчет в языке запросов и схеме компоновки данных (СКД), а также разберем распространенные ошибки и нюансы работы с функциями дат.

Способ 1. Использование функции РАЗНОСТЬДАТ в запросе

Самый простой вариант решения — использование встроенной функции языка запросов 1С РАЗНОСТЬДАТ. Она принимает три параметра: начальную дату, конечную дату и тип разности.

Рассмотрим пример конструкции запроса:

РАЗНОСТЬДАТ(Сотрудники.ФизическоеЛицо.ДатаРождения, &Период, ГОД)

Важная особенность: Функция РАЗНОСТЬДАТ с типом ГОД подсчитывает количество пройденных календарных границ года. Это означает, что для дат 31.12.2023 и 01.01.2024 функция вернет значение 1, хотя фактически прошел только один день, и полный год еще не исполнился. Если вам требуется точный расчет прожитых лет с учетом месяца и дня рождения, рекомендуется использовать второй способ.

Способ 2. Точный расчет полных лет с помощью конструкции ВЫБОР

Чтобы корректно вычислить возраст сотрудника и не завысить результат до наступления дня рождения в текущем году, разберем более точную формулу. Вычтем разницу лет и проверим, наступил ли уже день рождения в расчётном периоде.

Проанализируем следующий пример запроса:


ВЫБОР
	КОГДА Сотрудники.ФизическоеЛицо.ДатаРождения ЕСТЬ NULL 
		ИЛИ Сотрудники.ФизическоеЛицо.ДатаРождения = ДАТАВРЕМЯ(1, 1, 1)
		ИЛИ Сотрудники.ФизическоеЛицо.ДатаРождения > &Период
	ТОГДА 0
	ИНАЧЕ ГОД(&Период) - ГОД(Сотрудники.ФизическоеЛицо.ДатаРождения) 
		+ ВЫБОР 
			КОГДА МЕСЯЦ(Сотрудники.ФизическоеЛицо.ДатаРождения) * 100 + ДЕНЬ(Сотрудники.ФизическоеЛицо.ДатаРождения) > МЕСЯЦ(&Период) * 100 + ДЕНЬ(&Период) 
			ТОГДА -1 
			ИНАЧЕ 0 
		КОНЕЦ 
КОНЕЦ

В этой формуле мы:

  1. Проверяем дату рождения на заполненность (NULL или пустая дата 0001-01-01), а также проверяем, не превышает ли дата рождения заданный период.
  2. Получаем базовую разницу в годах между периодом отчета и датой рождения.
  3. Сравниваем день и месяц рождения с текущим месяцем и днем периода. Если день рождения в текущем году еще не наступил, вычитаем 1 год из итогового значения.

Передача параметра периода в СКД

Для того чтобы расчет выполнялся на текущую дату или выбранную пользователем дату отчета, необходимо настроить параметр &Период в схеме компоновки данных.

Выполним следующие шаги по настройке СКД:

  1. Перейдем на вкладку Параметры в компоновке данных.
  2. Найдем параметр Период. В поле Выражение зададим функцию ТекущаяДата(), чтобы по умолчанию отчет строился на текущий момент.
  3. Установим флажок Включать в пользовательские настройки, чтобы пользователь мог самостоятельно выбирать произвольную дату отчета при необходимости.

Если отчет вызывается программно из кода 1С, передачу параметра можно выполнить следующей конструкцией:


Запрос.УстановитьПараметр("Период", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();

Причины ошибки "Неверные параметры РазностьДат" в СКД

Часто разработчики сталкиваются с ошибкой синтаксиса при вычислении возраста во вкладке Вычисляемые поля СКД. Выясним причину разницы в синтаксисе:

  1. В Языке запросов 1С ключевое слово типа периода передается без кавычек: РАЗНОСТЬДАТ(Дата1, Дата2, ГОД).
  2. В Языке выражений СКД (в вычисляемых полях) тип периода передается строго в виде строки: РазностьДат(Дата1, &Период, "Год").

Учитывая эти различия синтаксиса, вы сможете избежать ошибок при формировании вычисляемых полей и получить точный возраст сотрудника в отчете.

← На главную