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

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

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

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

&НаКлиенте
Процедура РасчетВозраста ()
  РеквезитТабличнойЧасти.Возраст = ТекущаяДата – РеквезитТабличнойЧасти.ДатаРождения ;
КонецПроцедуры
8 Барматолог
 
09.11.16
17:12
(7) Ты возраст в чем меряешь?
9 h-sp
 
09.11.16
17:13
(7) ну это вы в секундах получили. Если вам в днях надо, тогда

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

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

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

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

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