Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Вопрос от новичка - расчет Возраста

Вопрос от новичка - расчет Возраста
Я
   Nidenger
 
09.11.16 - 16:24
Здравствуйте уважаемые эксперты! Являюсь новичком в программирование на 1с и при создание собственной "тестовой" конфигурации" появился вопрос.
У справочника ЧленыСемьи есть у меня табличная часть - Биография, в ней есть реквизиты справочника - ДатаРождения (тип Дата) и Возраст(тип Число). Я хотел бы чтобы - когда будет заполнен реквизит ДатаРождения, в Возраст автоматически вставлялась "цифра возраста, например 23". По логике я должен ТЕКУЩУЮДАТУ (сегоднящий день и год) - ДатаРождения (07.10.1993) = Возраст
Если я напишу в Модуль формы Справочника следующий код:

&НаКлиенте
Процедура РасчетВозраста ()
  ТекущаяДата – РеквезитТабличнойЧасти.ДатаРождения = РеквезитТабличнойЧасти.Возраст ;
КонецПроцедуры 

Как довести до ума это ?
 
 
   Fragster
 
1 - 09.11.16 - 16:31
а в "программирование" не на 1с тоже новичок?
   f_vadim
 
2 - 09.11.16 - 16:35
(1) похоже гуру, или как там они на ближнем востоке называются...
   разработчик 1с
 
3 - 09.11.16 - 16:38
в след году будешь открывать все элементы, заново возраст рассчитывать?
   f_vadim
 
4 - 09.11.16 - 16:38
Оператор присваивания

Синтаксис:
<Назначение> = <Источник>;
   bootini
 
5 - 09.11.16 - 16:40
   Windyhead
 
6 - 09.11.16 - 16:45
(3) На регламент повесит, когда дойдет до этой главы ))))
   Nidenger
 
7 - 09.11.16 - 17:02
Хорошо, подскажите как правильней сформулировать? Как правильно сделать в данном случае?

&НаКлиенте
Процедура РасчетВозраста ()
  РеквезитТабличнойЧасти.Возраст = ТекущаяДата – РеквезитТабличнойЧасти.ДатаРождения ;
КонецПроцедуры
   Барматолог
 
8 - 09.11.16 - 17:12
(7) Ты возраст в чем меряешь?
   h-sp
 
9 - 09.11.16 - 17:13
(7) ну это вы в секундах получили. Если вам в днях надо, тогда
РеквезитТабличнойЧасти.Возраст = (ТекущаяДата – РеквезитТабличнойЧасти.ДатаРождения) / 60 / 60 / 24;
   kosts
 
10 - 09.11.16 - 17:14
(9) Возраст людей обычно в годах измеряют
 
 Рекламное место пустует
   Барматолог
 
11 - 09.11.16 - 17:14
(9) И спрашиваешь такой обычно "А вам сколько дней?"
   Nidenger
 
12 - 09.11.16 - 17:16
Да у меня Возраст это реквизит табличной части - Число, Длина 3, Точно 0, неотрицательное.

РеквезитТабличнойЧасти.Возраст = (ТекущаяДата – РеквезитТабличнойЧасти.ДатаРождения) / 60 / 60 / 24;

Мне данный код записать в Модуль формы или обьекты?
   Барматолог
 
13 - 09.11.16 - 17:17
(9) + оговорюсь - моя ирония конечно не к вам)
   kosts
 
14 - 09.11.16 - 17:17
(0) Разбей свою задачу на две части.
Сперва составь словесный алгоритм как бы ты вычислял свой возраст на сегодня.
Потом уже перекладывай в программу.
   Nidenger
 
15 - 09.11.16 - 17:17
Да мне нужно чтобы в реквизите Возраст только год писался а не дни, вы правы
   aleks_default
 
16 - 09.11.16 - 17:18
Год(ТекущаяДата()) – Год(РеквезитТабличнойЧасти.ДатаРождения)
и не хранить в реквизите справочника, а создать реквизит формы в который и писать и расчитывать при открытии формы
   Nidenger
 
17 - 09.11.16 - 17:19
aleks_default спасибо за хороший совет!
   kosts
 
18 - 09.11.16 - 17:20
(16) Если подсказывать, то хотя бы чуть-чуть близко к правде подсказывал...
   разработчик 1с
 
19 - 09.11.16 - 17:21
(17) а если человек родился в декабре, сейчас ноябрь, формула правильный возраст посчитает?
   aleks_default
 
20 - 09.11.16 - 17:22
(18)А че не так? Я конечно упростил, но вроде не наврал...
   singlych
 
21 - 09.11.16 - 17:23
(16) добавь еще
- (Формат(ТекущаяДата(), "ДФ=MMdd") < Формат(РеквезитТабличнойЧасти.ДатаРождения, "ДФ=MMdd"))
   kosts
 
22 - 09.11.16 - 17:26
(20) Если ребенок родился 31 декабря, по этому алгоритму ему уже на следующий день год будет...
   aleks_default
 
23 - 09.11.16 - 17:29
вот буквоеды
   kosts
 
24 - 09.11.16 - 17:31
(23) Программисту как никому, надо на мелочи обращать внимание. Из-за одной ошибки космические корабли взрываются.
   newbling
 
25 - 09.11.16 - 17:34
(24) и дети становятся стариками
   Михаил Козлов
 
26 - 09.11.16 - 17:40
Для собственной даты рождения рассмотрите такие варианты (в текущем году):
- текущий месяц меньше;
- текущий месяц больше;
- текущий месяц тот же:
  - текущий день меньше; 
  - текущий день больше;
  - текущий день тот же.
   IlyaSR
 
27 - 09.11.16 - 17:57
РАЗНОСТЬДАТ(ТекущаяДата(), ДатаРождения, "ГОД")
   KnightAlone
 
28 - 09.11.16 - 18:01
ВОт из типовой:
        |    ВЫБОР
        |        КОГДА ГОД(ВыборкаДляСтавки.Сотрудник.Физлицо.ДатаРождения) = 1
        |            ТОГДА 0
        |        ИНАЧЕ &ДатаАктуальности_Год - ГОД(ВыборкаДляСтавки.Сотрудник.Физлицо.ДатаРождения) + ВЫБОР
        |                КОГДА МЕСЯЦ(ВыборкаДляСтавки.Сотрудник.Физлицо.ДатаРождения) * 100 + ДЕНЬ(ВыборкаДляСтавки.Сотрудник.Физлицо.ДатаРождения) > &ДатаАктуальности_Месяц * 100 + &ДатаАктуальности_День
        |                    ТОГДА -1
        |                ИНАЧЕ 0
        |            КОНЕЦ
        |    КОНЕЦ КАК Возраст
   singlych
 
29 - 09.11.16 - 18:05
(27) (28) вы гвозди в стену тоже через запрос забиваете?
   KnightAlone
 
30 - 09.11.16 - 18:07
(29) ты чего умное сказать хотел или ищешь повод посра_ться? у меня есть это было в виде запроса, я сюда кинул в виде примера, мысль понять можно. переписать это для клиента надеюсь ума хватит. если не хватит - не понятно зачем вообще за программирование браться
   h-sp
 
31 - 09.11.16 - 18:11
(27) читай (22)
   marvak
 
32 - 09.11.16 - 18:37
вот мой второй вариант

Функция ПолучитьВозраст(ДатаРождения) Экспорт 
    
    ТекДата = ТекущаяДата();
    ТекущийМесяц = Месяц(ТекДата);
    РожденияМесяц = Месяц(ДатаРождения);
    ТекущийГод = Год(ТекДата);
    РожденияГод = Год(ДатаРождения);
    ТекущийДень = День(ТекДата);
    РожденияДень = День(ДатаРождения);
    
    // Число полных лет между текущей датой и датой рождения

    
    Если Не ЗначениеЗаполнено(ДатаРождения) Или (ДатаРождения > ТекДата) Тогда
        Возврат 0;
    Иначе
        Если ТекущийГод = РожденияГод Тогда
            Возврат 0;
        Иначе
            Если ТекущийМесяц < РожденияМесяц Тогда
                Возврат ТекущийГод - РожденияГод - 1;
            ИначеЕсли ТекущийМесяц > РожденияМесяц Тогда
                Возврат ТекущийГод - РожденияГод;
            ИначеЕсли ТекущийМесяц = РожденияМесяц Тогда
                Если ТекущийДень < РожденияДень Тогда
                    Возврат ТекущийГод - РожденияГод - 1;
                Иначе
                    Возврат ТекущийГод - РожденияГод;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
КонецФункции
   Garykom
 
33 - 09.11.16 - 18:52
Возраст = Цел((ТекущаяДата()-ДатаРождения)/КолвоСекВГоду);
 
 
   Михаил Козлов
 
34 - 09.11.16 - 19:02
(33) КолвоСекВГоду примерно Pi*10^7.
   Михаил Козлов
 
35 - 09.11.16 - 19:03
(34)+ Нужно еще високосные учитывать.
   МимохожийОднако
 
36 - 09.11.16 - 19:20
ОФФ: пятнично
   Garykom
 
37 - 09.11.16 - 19:47
(35) Это такой намек как не повезло родившимся 29 февраля?
   Garykom
 
38 - 09.11.16 - 19:48
(37)+ зато какая экономия на ДР, а подарки можно чтобы накапливали (за пропущенные не високосные) к предстоящему в будущем торжеству
   GROOVY
 
39 - 09.11.16 - 20:10
Одного не могу понять, зачем в реквизитах хранить рассчитываемый показатель?
   Garykom
 
40 - 09.11.16 - 20:15
(39) В оригинале это такая замена для РС или доков для случая сохранения данных созданных на некие даты "резюме"
   Dmitry77
 
41 - 09.11.16 - 20:17
(0)посмотри как в типовом зупе стаж считается...

Скопируй из зупа необходимые функции...
   Fram
 
42 - 09.11.16 - 22:31
(41) он присваивать не умеет, а вы его в зуп отправляете
   EvgeniuXP
 
43 - 09.11.16 - 22:43
Функция ПолучитьВозраст(Знач ДатаРождения, Знач ДатаАктуальности, Возраст = 0) Экспорт
    
    ДатаРождения = НачалоДня(ДатаРождения);
    ДатаАктуальности = НачалоДня(ДатаАктуальности);
    
    Возраст = 0;
    
    Если ЗначениеЗаполнено(ДатаРождения) И ЗначениеЗаполнено(ДатаАктуальности) И ДобавитьМесяц(ДатаРождения, 12) <= ДатаАктуальности Тогда
        
        Возраст = Год(ДатаАктуальности) - Год(ДатаРождения);
        
        Если Возраст > 0 Тогда
            
            Если ДобавитьМесяц(ДатаРождения, 12 * Возраст) > ДатаАктуальности Тогда
                
                Возраст = Возраст - 1;
                
            КонецЕсли; 
            
        КонецЕсли; 
        
    КонецЕсли;
    
    Если Возраст = 0 Тогда
        
        ВозрастВВидеТекста = "";
        
    Иначе
        
        ВозрастВВидеТекста = ПолучитьВозрастВВидеТекста(Возраст);
        
    КонецЕсли; 
    
    Возврат ВозрастВВидеТекста;
    
КонецФункции
   EvgeniuXP
 
44 - 09.11.16 - 22:45
эту же самую идею можно перетащить в запрос.
   bolder
 
45 - 09.11.16 - 22:47
(42) Это было особенно прикольно.Новые одинесники на подходе!
   EvgeniuXP
 
46 - 09.11.16 - 22:54
Функция ПолучитьВозрастВВидеТекста(Знач Возраст)
    
    ВозрастВВидеТекста = Строка(Возраст) + " " + ПолучитьПодписьИзЧисла(Возраст, "год, года, лет, м");
    
    Возврат ВозрастВВидеТекста;
    
КонецФункции
   EvgeniuXP
 
47 - 16.11.16 - 17:49
От новичка даже спасибо нет :)
   Aistovich
 
48 - 16.11.16 - 18:30
(47) всем реквезитам реквезет!


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует