helpf.pro
Регистрация

v8: Рассчитать возраст в форме списка

Failodrom
28.12.2013 19:53Прочитано: 3571
Здравствуйте! Подскажите, пожалуйста, как можно рассчитать возраст в форме списка справочника? Каким способом лучше это сделать?
Yandex
Возможно, вас также заинтересует
Реклама на портале
Jonsony
28.12.2013 20:54Ответ № 1
целое от (текущая дата-дата рождения)/365 ?

примерно так (если в датах есть время)
Код 1C v 8.2 УП
 Возраст = Цел((ТекущаяДата()-ДатаРождения)/60/60/24/365);   
Jonsony
28.12.2013 20:58Ответ № 2
вот ещё вариант, но надо ещё умножить там на 365 в делителе
https://help1c.com/faq/view/645.html

или даже через запрос
https://help1c.com/faq/view/112.html

или вот через кучу кода
https://help1c.com/faq/view/1113.html
Failodrom
28.12.2013 21:14Ответ № 3
Проблема в том, как это сделать в форме списка, так как там появляется ошибка и пишет, что поле не доступно для записи. Как в таком случае быть?
TValka
28.12.2013 22:15Ответ № 4
Передать на сервер объект!
Failodrom
28.12.2013 22:38Ответ № 5
(4) TValka, это как будет выглядеть?
Jonsony
29.12.2013 08:42Ответ № 6
(5) Failodrom, а что от этой цифры требуется вообще?
просто показывать возраст на форме справочника? ибо хранить его нет смысла абсолютно
использовать его где-то ещё? ну так и высчитывать его тогда же
не вижу смысла в записи его в справочник, просто заполняй значением реквизит на форме
RinatSibay
03.01.2025 06:17Ответ № 7

Привет из будущего! Спасибо Jonsony за ответ! Жалко только код будет барахлить при високосном годе то... А возраст мне к примеру нужен, чтобы при открытии БД знать его. К примеру когда вызываешь скорую, или когда в справочнике делаешь отсев по возрасту, отчеты не всегда с руки делать, чтобы возраст пациента узнать.

saha85
31.01.2025 07:32Ответ № 8

@Failodrom у меня так прописано.

&НаСервере

Процедура глРазобратьРазностьДат(Знач Дата_рождения,Знач ТекущаяДата,Лет=0,Месяцев=0,Дней=0) Экспорт

Лет = 0; Месяцев = 0; Дней = 0;

Если Дата_рождения>ТекущаяДата Тогда

ВременнаяДата = Дата_рождения;

Если День(ВременнаяДата)<День(ТекущаяДата) Тогда

Дней = (ВременнаяДата-ДобавитьМесяц(ВременнаяДата,-1))/(60*60*24);

ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);

КонецЕсли;

Если Месяц(ВременнаяДата)<Месяц(ТекущаяДата) Тогда

ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);

Месяцев = 12;

КонецЕсли;

Лет = Макс(Год(ВременнаяДата) - Год(ТекущаяДата),0);

Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) - Месяц(ТекущаяДата),0);

Дней = Макс(Дней + День(ВременнаяДата) - День(ТекущаяДата),0);

// скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах

Если ТекущаяДата <> (ДобавитьМесяц(Дата_рождения,-Лет*12-Месяцев)-(Дней*60*60*24)) Тогда

Дней = Дней + Макс((((КонецМесяца(ТекущаяДата)-НачалоМесяца(ТекущаяДата))) - (КонецМесяца(ДобавитьМесяц(Дата_рождения,-1))-НачалоМесяца(ДобавитьМесяц(Дата_рождения,-1))))/(60*60*24));

КонецЕсли;

КонецЕсли;

КонецПроцедуры // глРазобратьРазностьДат

&НаКлиенте

Процедура Рассчитать(Команда)

Лет = 0;

Месяцев = 0;

Дней = 0;

глРазобратьРазностьДат(Дата_рождения,ТекущаяДата,Лет,Месяцев,Дней);

Сообщить("Лет:"+Лет+" Месяцев:"+Месяцев+" Дней:"+Дней);

КонецПроцедуры

Дата_рождения

ТекущаяДата

zeroweb
31.01.2025 10:29Ответ № 9

Функция ПолучитьПолноеЧислоЛетСДаты(Знач ДатаНачала, Знач ДатаОкончания) Экспорт

ВозрастЛет = Год(ДатаОкончания) - Год(ДатаНачала);

Если Месяц(ДатаОкончания) < Месяц(ДатаНачала)

Или Месяц(ДатаОкончания) = Месяц(ДатаНачала) И День(ДатаОкончания) < День(ДатаНачала)

Тогда

ВозрастЛет = ВозрастЛет - 1;

КонецЕсли;

Возврат ВозрастЛет;

КонецФункции

Функция ПолучитьВозрастСтрокой(Знач ДатаРождения, Знач ДатаОтсчета = Неопределено, Выводить0Лет = Ложь, ТолькоПолныхЛет = Ложь) Экспорт

Если Не ЗначениеЗаполнено(ДатаРождения) Тогда

Возраст = "";

Иначе

Если Не ЗначениеЗаполнено(ДатаОтсчета) Тогда

ДатаОтсчета = НачалоДня(ТекущаяДата());

КонецЕсли;

ВозрастЛет = ПолучитьПолноеЧислоЛетСДаты(ДатаРождения, ДатаОтсчета);

Если ВозрастЛет >= 0 Тогда

Возраст = Формат(ВозрастЛет,"ЧГ=0; ЧН=");

Послед = Число(Прав(Возраст,2));

Если Послед > 20 Тогда

Послед = Послед % 10;

КонецЕсли;

// Склонение года

Если Послед = 1 Тогда

Возраст = Возраст + " " + НСтр("ru='год'");

ИначеЕсли Послед = 0 Или Послед > 4 Тогда

Возраст = Возраст + " " + НСтр("ru='лет'");

Иначе

Возраст = Возраст + " " + НСтр("ru='года'");

КонецЕсли;

Если ВозрастЛет = 0 И Не Выводить0Лет Тогда

Возраст = "";

КонецЕсли;

// Для детей до 3 лет выводится количество месяцев

Если ВозрастЛет < 3 Тогда

ВозрастМесяцев = 0;

// Находим последний день рождения.

мДата = ДатаРождения;

Пока мДата <= ДатаОтсчета Цикл

мДата = ДобавитьМесяц(мДата, 12);

КонецЦикла;

ПоследнийДР = ДобавитьМесяц(мДата, -12);

мДата = ДатаОтсчета;

Пока Истина Цикл

мДата = ДобавитьМесяц(мДата,-1);

Если мДата > ПоследнийДР Тогда

ВозрастМесяцев = ВозрастМесяцев + 1;

Иначе

Прервать;

КонецЕсли;

КонецЦикла;

Если ВозрастМесяцев = 0 Тогда

// 0 месяцев - выводим количество дней

ВозрастДней = Цел((ДатаОтсчета- ДатаРождения) / 86400);

Возраст = Формат(ВозрастДней,"ЧН=0") + " " + НСтр("ru='дней'");

ИначеЕсли ВозрастЛет = 0 Или Не ТолькоПолныхЛет Тогда

Возраст = Возраст + " " + Формат(ВозрастМесяцев,"ЧН=0");

// Склонение месяца

Если ВозрастМесяцев = 1 Тогда

Возраст = Возраст + " " + НСтр("ru='месяц'");

ИначеЕсли ВозрастМесяцев >= 2 И ВозрастМесяцев <= 4 Тогда

Возраст = Возраст + " " + НСтр("ru='месяца'");

Иначе

Возраст = Возраст + " " + НСтр("ru='месяцев'");

КонецЕсли;

КонецЕсли;

КонецЕсли;

Иначе

Возраст = "";

КонецЕсли;

КонецЕсли;

Возврат Возраст;

КонецФункцииПроцедура ВозрастТек()/// Значение строкой типа 45 лет 21 год

Объект.Возраст = ПолучитьВозрастСтрокой(ДатаРождения);КонецПроцедуры

Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.