Имя: Пароль:
1C
1C 7.7
v7: Мне необходимо рассчитать возраст сотрудника на дату увольнения
0 ЮлияКорж
 
28.02.12
10:55
Мне необходимо рассчитать возраст сотрудника на дату увольнения вывести сотрудников которым до 20 лет с 21 до 30 на дату увольнения как правильно  вычислить возраст на дату увольнения
1 Wobland
 
28.02.12
10:58
(0) я б в восьмёрке сказал РАЗНОСТЬДАТ() в запросе...
2 SeraFim
 
28.02.12
11:00
глРазобратьРазностьДат?
3 K-5
 
28.02.12
11:00
А что сложного?

Кури

ДатаГод(<?>)
Синтаксис:
ДатаГод(<Дата>)
Назначение:
Возвращает числовое значение года для заданной даты.
Параметры:
<Дата> - выражение со значением типа дата.
4 Wobland
 
28.02.12
11:04
(3) високосные года
5 ЮлияКорж
 
28.02.12
11:05
Это вариант правильный чи нет на ваш взгляд
ГодР = ДатаГод(ДатаР);
   МесР = ДатаМесяц(ДатаР);
   ЧслР = ДатаЧисло(ДатаР);
   ГодА = ДатаГод(ДатаА);
   МесА = ДатаМесяц(ДатаА);
   ЧслА = ДатаЧисло(ДатаА);
   Лет =  Цел(((ГодА-ГодР)*12+МесА-МесР)/12);
   Мес = ((ГодА-ГодР)*12+МесА-МесР)-Лет*12;
6 Wobland
 
28.02.12
11:08
(5) ДатаР=29.02.12; ДатаА=28.02.13;
по-твоему получается Лет=1; Мес=0;
а на самом деле как? уже 1 или ещё нет? ;)
7 ЮлияКорж
 
28.02.12
11:10
Этот алгоритм по вашему
Пока Сотр.ПолучитьЭлемент()>0 Цикл
   ФизЛицо.НайтиЭлемент(Сотр.ТекущийЭлемент().ФизическоеЛицо);
       Если((Сотр.ДатаОкончанияДействия>=НачалоТекущегоПериода) И (Сотр.ДатаОкончанияДействия<КонецТекущегоПериода)) Тогда    
ДеньРожденияЭтогоГода = НачГода(Сотр.ДатаОкончанияДействия);
Пока ДатаМесяц(ДеньРожденияЭтогоГода) < ДатаМесяц(Сотр.ФизическоеЛицо.ДатаРождения) Цикл
ДеньРожденияЭтогоГода = ДобавитьМесяц(ДеньРожденияЭтогоГода,1);
КонецЦикла;
Пока ДатаЧисло(ДеньРожденияЭтогоГода) < ДатаЧисло(Сотр.ФизическоеЛицо.ДатаРождения) Цикл
ДеньРожденияЭтогоГода = ДеньРожденияЭтогоГода + 1;
КонецЦикла;
ЛетВЭтомГоду = ДатаГод(ДеньРожденияЭтогоГода) - ДатаГод(Сотр.ФизическоеЛицо.ДатаРождения);
Если ДеньРожденияЭтогоГода > Сотр.ДатаОкончанияДействия Тогда
ЛетСотруднику = ЛетВЭтомГоду - 1;
Иначе
ЛетСотруднику = ЛетВЭтомГоду;
КонецЕсли;
КонецЕсли;
8 НЕА123
 
28.02.12
11:16
(0)

ДобавитьМесяц(ДатаРождения, 20*12) < ДатаУвольнения
?
9 ЮлияКорж
 
28.02.12
11:25
Так этот алгоритм верный или нет
10 TeddySlaf
 
28.02.12
11:27
(9) весьма хорош (8)
Тебе ж не надо конкретно знать возвраст. Надо лишь проверить, на вход в нужные интервалы.
11 ЮлияКорж
 
28.02.12
11:34
Мне ненравится, что на выходе имеются отрицательные значения  возраста
12 ЮлияКорж
 
28.02.12
11:34
21
22
53
46
-46
23
51
19
49
45
30
24
44
27
49
24
-46
20
29
30
37
42
-45
2
13 TeddySlaf
 
28.02.12
11:38
ты, наверно, пишешь не про алгоритм в (8) , а про другой.
14 TeddySlaf
 
28.02.12
11:41
Кстати, в задаче (0) надо уточнить границы диапазонов.
У тебя щас:
-до 20;
-от 21 до 30;
-...

Например, Куда девать ровно Двадцатилетних детей?
15 ЮлияКорж
 
28.02.12
11:44
В УСЛОВИИ ВОЗРАСТ ПОСТАВИТЬ <=20 я еще не учитывала надо сначала добиться чтобы обработка правильно считала возраст
16 Deon
 
28.02.12
11:45
(15) Чем тебя (8) не удовлетворяет?
17 ЮлияКорж
 
28.02.12
11:47
Мне необходимо, чтобы не было этих отрицательных возрастов, возраст  не может быть отрицательным значением
18 PuhUfa
 
28.02.12
11:48
(17) весь код показывай
19 TeddySlaf
 
28.02.12
11:48
(17) как у тебя , используя алгоритм в (8) может получиться отрицательное целое?
20 Deon
 
28.02.12
11:49
(19) Видимо, все-таки нужен именно возраст
21 ЮлияКорж
 
28.02.12
11:50
Процедура Выполнить()
Перем НачалоТекущегоПериода, КонецТекущегоПериода,ЛетСотруднику,ДеньРожденияЭтогоГода,ЛетВЭтомГоду;
   НачалоТекущегоПериода = Дата1;
   КонецТекущегоПериода = Дата2 + 1;
ФизЛицо=СоздатьОбъект("Справочник.ФизическиеЛица");
Сотр=СоздатьОбъект("Справочник.Сотрудники");
Сотр.ВыбратьЭлементы();
Пока Сотр.ПолучитьЭлемент()>0 Цикл
   ФизЛицо.НайтиЭлемент(Сотр.ТекущийЭлемент().ФизическоеЛицо);
       Если((Сотр.ДатаОкончанияДействия>=НачалоТекущегоПериода) И (Сотр.ДатаОкончанияДействия<КонецТекущегоПериода)) Тогда    
ДеньРожденияЭтогоГода = НачГода(Сотр.ДатаОкончанияДействия);
Пока ДатаМесяц(ДеньРожденияЭтогоГода) < ДатаМесяц(Сотр.ФизическоеЛицо.ДатаРождения) Цикл
    ДеньРожденияЭтогоГода = ДобавитьМесяц(ДеньРожденияЭтогоГода,1);
КонецЦикла;
Пока ДатаЧисло(ДеньРожденияЭтогоГода) < ДатаЧисло(Сотр.ФизическоеЛицо.ДатаРождения) Цикл
    ДеньРожденияЭтогоГода = ДеньРожденияЭтогоГода + 1;
КонецЦикла;
ЛетВЭтомГоду = ДатаГод(ДеньРожденияЭтогоГода) - ДатаГод(Сотр.ФизическоеЛицо.ДатаРождения);
Если ДеньРожденияЭтогоГода > Сотр.ДатаОкончанияДействия Тогда
    ЛетСотруднику = ЛетВЭтомГоду - 1;
Иначе
     ЛетСотруднику = ЛетВЭтомГоду;

Сообщить(ДеньРожденияЭтогоГода);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
22 TeddySlaf
 
28.02.12
11:50
если ДобавитьМесяц(ДатаРождения, 20*12) < ДатаУвольнения
Тогда
//* тут действия с малолеткой

ИначеЕсли ДобавитьМесяц(ДатаРождения, 30*12) < ДатаУвольнения
Тогда
//* тут действия со студентом

Иначе
//* тут действия с пенсионэрами

КонецЕсли;
23 Ирис_яркая
 
модератор
28.02.12
11:53
для 8 так


Запрос=новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
|    УвольнениеИзОрганизацийРаботникиОрганизации.Физлицо,
|    УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения,
|    РАЗНОСТЬДАТ(УвольнениеИзОрганизацийРаботникиОрганизации.Физлицо.ДатаРождения, УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения, ГОД) КАК Поле1,
|    УвольнениеИзОрганизацийРаботникиОрганизации.Ссылка
|ИЗ
|    Документ.УвольнениеИзОрганизаций.РаботникиОрганизации КАК УвольнениеИзОрганизацийРаботникиОрганизации
|ГДЕ
|    РАЗНОСТЬДАТ(УвольнениеИзОрганизацийРаботникиОрганизации.Физлицо.ДатаРождения, УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения, ГОД) = &ТребуемыйВозраст
|";
Запрос.УстановитьПараметр("ТребуемыйВозраст",34);
Результат = Запрос.Выполнить();
Результат = Результат.Выгрузить();
Для каждого СтрокаТЗ из Результат Цикл
КонецЦикла;
24 Deon
 
28.02.12
11:56
(21) ДеньРожденияЭтогоГода Можно попроще получить:
ДеньРожденияЭтогоГода = ДобавитьМесяц( Сотр.ФизическоеЛицо.ДатаРождения, (ДатаГод(Сотр.ДатаОкончанияДействия) - ДатаГод(Сотр.ФизическоеЛицо.ДатаРождения))*12)
25 K-5
 
28.02.12
12:23
(4) мрак
26 K-5
 
28.02.12
12:35
+(25)
Функция  РазностьЛет(ДР,ДатаУвольнения)
   Если ДР<ДатаУвольнения Тогда
       Возврат -1;
   КонецЕсли;
       
   ГодР=  ДатаГод(ДР);
   МесР=ДатаМесяц(ДР);
   ДенР=ДатаЧисло(ДР);
   
   
   ГодУ=ДатаГод(ДатаУвольнения);
   ДрГу=Дата(ГодУ,МесР,ДенР);
   
   Если ДрГу>=ДатаУвольнения
       Тогда
           Возврат (ГодУ-ГодР);
       Иначе
           Возврат (ГодУ-ГодР-1);
   КонецЕсли;
КонецПроцедуры
27 zak555
 
28.02.12
12:49
Процедура глРазобратьРазностьДат(Знач Дата1,Знач Дата2,Лет=0,Месяцев=0,Дней=0) Экспорт
   
   Лет = 0; Месяцев = 0; Дней = 0;
   Если Дата1 > Дата2 Тогда
       
       Год1 = ДатаГод(Дата1);
       Год2 = ДатаГод(Дата2);
       
       Месяц1 = ДатаМесяц(Дата1);
       Месяц2 = ДатаМесяц(Дата2);
       
       Число1 = ДатаЧисло(Дата1);
       Число2 = ДатаЧисло(Дата2);
       
       Если Число1 < Число2 Тогда
           Дней = НачМесяца(Дата1) - НачМесяца(ДобавитьМесяц(Дата1,-1));
           Месяц1 = Месяц1 - 1;
       КонецЕсли;
       
       Дней = Дней + Число1 - Число2;  // Дней ( до исполнения строки) - заем из Месяцев
       
       Если Месяц1 < Месяц2 Тогда
           Месяцев = 12;
           Год1 = Год1 - 1;
       КонецЕсли;
       
       Месяцев = Месяцев + Месяц1 - Месяц2;  // Месяцев ( до исполнения строки) - заем из Лет
       
       Лет = Год1 - Год2;
       
   КонецЕсли;
   
КонецПроцедуры
28 ЮлияКорж
 
28.02.12
13:15
И в первом и во втором случае выбиваютя отрицательные значения
29 TeddySlaf
 
28.02.12
13:21
из ЗиК:

//******************************************************************************
//    глРазобратьРазностьДат(Дата1,Дата2,Лет,Месяцев,Дней)
//
//    Параметры:
//        Дата1    - первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
//        Дата2    - вторая дата (ранняя дата, с нее начинается "течение" стажа)
//        Лет        - в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
//        Месяцев    - в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
//        Дней    - в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
//    Описание:
//        Процедура разбирает две даты и возвращает в параметрах кол-во лет, месяцев и дней
//        между двумя датами (Дата1-Дата2)
//
       // алгоритм Пенсионного фонда
       //Мк = ДатаМесяц(Дата1);
       //Гк = ДатаГод(Дата1);
       //Если ДатаЧисло(Дата1) - ДатаЧисло(Дата2) < 0 Тогда
       //    Дней = ДатаЧисло(Дата1) - ДатаЧисло(Дата2) + 30;
       //    Мк = Мк - 1;
       //Иначе
       //    Дней = ДатаЧисло(Дата1) - ДатаЧисло(Дата2);
       //КонецЕсли;
       //Если Мк - ДатаМесяц(Дата2) < 0 Тогда
       //    Месяцев = Мк - ДатаМесяц(Дата2) + 12;
       //    Гк = Гк - 1;
       //Иначе
       //    Месяцев = Мк - ДатаМесяц(Дата2);
       //КонецЕсли;
       //Лет    = Гк-ДатаГод(Дата2);
       //Дней = Дней + 1;
       //Если Дней >= 30 Тогда
       //    Дней = 0;
       //    Месяцев = Месяцев + 1;
       //КонецЕсли;
       //Если Месяцев = 12 Тогда
       //    Месяцев = 0;
       //    Лет    = Лет + 1
       //КонецЕсли;
Процедура глРазобратьРазностьДат(Знач Дата1,Знач Дата2,Лет=0,Месяцев=0,Дней=0) Экспорт

   Лет = 0; Месяцев = 0; Дней = 0;
   Если Дата1>Дата2 Тогда
       
       ВременнаяДата = Дата1;
       Если ДатаЧисло(ВременнаяДата)<ДатаЧисло(Дата2) Тогда
           Дней = ВременнаяДата-ДобавитьМесяц(ВременнаяДата,-1);
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
       КонецЕсли;
       Если ДатаМесяц(ВременнаяДата)<ДатаМесяц(Дата2) Тогда
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
           Месяцев = 12;
       КонецЕсли;
       Лет        = Макс(             ДатаГод  (ВременнаяДата)-ДатаГод  (Дата2),0);
       Месяцев    = Макс(Месяцев    +ДатаМесяц(ВременнаяДата)-ДатаМесяц(Дата2),0);
       Дней    = Макс(Дней        +ДатаЧисло(ВременнаяДата)-ДатаЧисло(Дата2),0);
       
       // скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
       Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней) Тогда
           Дней = Дней + (КонМесяца(Дата2)-НачМесяца(Дата2)) - (КонМесяца(ДобавитьМесяц(Дата1,-1))-НачМесяца(ДобавитьМесяц(Дата1,-1)));
       КонецЕсли;
   КонецЕсли;

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

//******************************************************************************
//    глПредставлениеСтажа(ДатаСтажа,ТекстСтажа,Лет,Месяцев,Дней)
//
//    Параметры:
//        ДатаСтажа    - дата стажа
//        ТекстСтажа    - текст стажа (если выбран стаж, то передается дата преобразованная в текст)
//        Лет            - в этот параметр будет записано кол-во лет между двумя датами (ТекстСтажа и ДатаСтажа)
//        Месяцев        - в этот параметр будет записано кол-во месяцев между двумя датами (ТекстСтажа и ДатаСтажа)
//        Дней        - в этот параметр будет записано кол-во дней между двумя датами (ТекстСтажа и ДатаСтажа)
//
//    Возвращаемое значение:
//        представление стажа, заданного двумя параметрами ДатаСтажа и ТекстСтажа
//
//    Описание:
//        Функция формирует и возвращает представление стажа.
//
Функция глПредставлениеСтажа(Знач ДатаСтажа,ТекстСтажа,Лет=0,Месяцев=0,Дней=0) Экспорт
   Лет = 0; Месяцев = 0; Дней = 0;
   // если в тексте стажа пустая строка, то стаж не задан
   Если ПустаяСтрока(ТекстСтажа)=1 Тогда
       Возврат "<<Стаж не задан>>"
   КонецЕсли;
   глРазобратьРазностьДат(ДатаСтажа,Дата(ТекстСтажа),Лет,Месяцев,Дней);
   Возврат ""    +Лет    +" "+глФормаМножественногоЧисла("год","года","лет",Лет)
           +" "+Месяцев+" "+глФормаМножественногоЧисла("месяц","месяца","месяцев",Месяцев)
           +" "+Дней    +" "+глФормаМножественногоЧисла("день","дня","дней",Число(Дней))
КонецФункции    // глПредставлениеСтажа
30 TeddySlaf
 
28.02.12
13:27
(28) Почему не делаешь ссылки на сообщения (случаи)?
И все-таки у тебя ведь не стоит задача узнать Срок жизни человека до увольнения. Тебе всего лишь надо проверить в какой диапазон входит срок, а для этого смотри (22).
31 ЮлияКорж
 
28.02.12
13:37
Мне необходимо узнать вывести количество сотрудников,которым на дату увольнения было до 20,20 включительно, потом 21 по 30,31-40,41-50 и больше 51
32 TeddySlaf
 
28.02.12
13:38
чем не устраивает алгоритм в (22) сообщении?
33 ЮлияКорж
 
28.02.12
14:06
короче я вот такую наваяла вроде как работает
Функция  ОпределениеЛет(ДатаР,ДатаА)
   ГодР = ДатаГод(ДатаР);
   МесР = ДатаМесяц(ДатаР);
   ЧслР = ДатаЧисло(ДатаР);
   ГодА = ДатаГод(ДатаА);
   МесА = ДатаМесяц(ДатаА);
   ЧслА = ДатаЧисло(ДатаА);
   Лет =  Цел(((ГодА-ГодР)*12+МесА-МесР)/12);
   Мес = ((ГодА-ГодР)*12+МесА-МесР)-Лет*12;
   Возврат Лет;
КонецФункции

Процедура Выполнить()
   Перем Рез;
   Рез=ОпределениеЛет(ДатаР,ДатаА);
     Сообщить(Рез);
КонецПроцедуры
34 НЕА123
 
28.02.12
14:27
(33)
ЧслХ не нужны?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.