Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 дек 2023, 18:14

Как рассчитать возраст в годах в 1C:Предприятие 8.3 ?

Автор Vlika1, 06 июн 2022, 20:07

0 Пользователей и 1 гость просматривают эту тему.

Vlika1


Vlika1


alexandr_ll

Vlika1, https://infostart.ru/1c/articles/616313/

Расчет возраста по дате рождения и текущей дате

Была задача - рассчитать возраст определенных лиц по дате их рождения. Решил поискать в интернете, как всегда множество мнений, множество реализаций, но, к сожалению, не встречал той статьи, где рассчитывалось количество полных лет, месяцев и дней. Например: 28 лет, 3 месяца, 15 дней. Решил заняться самостоятельно, и вот к чему это привело.

Как известно, в 1С есть неплохие средства работы с датами, которые в данной задаче я и попытался использовать.

И, конечно же, обработка "Консоль запросов":

Очень помогли мне функции


РАЗНОСТЬДАТ()

и


ДОБАВИТЬКДАТЕ()

В итоге получил такие запросы, в которых выставил ограничения по количеству записей (500) для отладки информации:


ВЫБРАТЬ ПЕРВЫЕ 500
Люди.Ссылка КАК Ссылка,
Люди.ДатаРождения КАК ДатаРождения,
ВЫБОР
КОГДА МЕСЯЦ(&ТекущаяДата) < МЕСЯЦ(Люди.ДатаРождения)
ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД) - 1
КОГДА МЕСЯЦ(&ТекущаяДата) > МЕСЯЦ(Люди.ДатаРождения)
ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД)
КОГДА МЕСЯЦ(&ТекущаяДата) = МЕСЯЦ(Люди.ДатаРождения)
ТОГДА ВЫБОР
КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(Люди.ДатаРождения)
ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД) - 1
КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(Люди.ДатаРождения)
ТОГДА РАЗНОСТЬДАТ(Люди.ДатаРождения, &ТекущаяДата, ГОД)
КОНЕЦ
ИНАЧЕ "Смотреть"
КОНЕЦ КАК Количество_лет
ПОМЕСТИТЬ Года
ИЗ
Справочник.Люди КАК Люди
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 500
Люди.Ссылка КАК Ссылка,
Люди.ДатаРождения КАК ДатаРождения,
ГОДА.Количество_лет КАК Количество_лет,
ВЫБОР
КОГДА МЕСЯЦ(&ТекущаяДата) < МЕСЯЦ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА ВЫБОР
КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА
РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ)
КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
ИНАЧЕ
РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
КОНЕЦ
КОГДА МЕСЯЦ(&ТекущаяДата) > МЕСЯЦ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА
ВЫБОР
КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА
РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ)
КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
ИНАЧЕ
РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
КОНЕЦ
КОГДА МЕСЯЦ(&ТекущаяДата) = МЕСЯЦ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА ВЫБОР
КОГДА ДЕНЬ(&ТекущаяДата) < ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ) - 1
КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)))
ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(Люди.ДатаРождения, ГОД, ВЫРАЗИТЬ(ГОДА.Количество_лет КАК ЧИСЛО)), &ТекущаяДата, МЕСЯЦ)
КОНЕЦ
ИНАЧЕ "Смотреть"
КОНЕЦ КАК Количество_месяцев
Поместить ГОДАМЕСЯЦА
ИЗ
Справочник.Люди КАК Люди
ЛЕВОЕ СОЕДИНЕНИЕ Года КАК ГОДА
ПО (Люди.Ссылка = ГОДА.Ссылка)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 500
Люди.Ссылка КАК Ссылка,
Люди.ДатаРождения КАК ДатаРождения,
ГОДАМЕСЯЦА.Количество_лет,
ГОДАМЕСЯЦА.Количество_месяцев,
РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(
ДОБАВИТЬКДАТЕ(
Люди.ДатаРождения,
ГОД,
ВЫРАЗИТЬ(ГОДАМЕСЯЦА.Количество_лет КАК ЧИСЛО)
),
МЕСЯЦ,
ВЫРАЗИТЬ(ГОДАМЕСЯЦА.Количество_месяцев КАК ЧИСЛО)),
&ТекущаяДата,
ДЕНЬ
) КАК Количество_дней
ИЗ
Справочник.Люди КАК Люди
ЛЕВОЕ СОЕДИНЕНИЕ ГОДАМЕСЯЦА КАК ГОДАМЕСЯЦА
ПО (Люди.Ссылка = ГОДАМЕСЯЦА.Ссылка)
;

Хотелось бы, конечно, довести эти запросы до совершенства, но ограничен во времени.

PS.

Не знаю, что делать с такими днями рождения - 29.02.1988. Возраст получаю - 29 лет 1 месяц 30 дней.

Если есть предложения, пишите в комментариях).


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск