Имя: Пароль:
1C
1С v8
Разность дат в месяцах и днях
0 SeraFim
 
08.11.11
10:49
Прежде чем тыкать в (ДатаОкончания - ДатаНачала)/86400 просьба дочитать:
Конфа - ЗИКБУ (в ЗУПе тоже самое).
Задача:
Есть данные из трудовой книжки:
01.05.1983 - 09.09.1989 ООО "Рога и Копыта"
01.05.1990 - 01.03.1995 ООО "Рога и Копыта2"
15.05.1999 - 07.06.2010 ООО "Рога и Копыта3"
Нужно внести в стаж работы в конфу (он вносится как количество месяцев и дней)
А как это правильно сделать?

Делаю так:
Посчитал количество дней между датами начала и окончания.
Просуммировал их.
Получил число дней стажа сотрудника (например, 1234 дня)
Нужна функция, которая правильно преобразует это в, например, 41 месяц и 4 дня.

Затык в том, как правильно поступать с разным количеством дней в месяцах?
ведь стаж с 01.02.2011 по 01.03.2011 - 28 дней (1 месяц)
а стаж с 01.03.2011 по 01.04.2011 - 31 день (1 месяц)
1 asady
 
08.11.11
10:54
Запросом пробовал?

ВЫБРАТЬ
   РАЗНОСТЬДАТ(&Дата1, &Дата2, ДЕНЬ) КАК КоличествоДней,
   РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ) КАК КоличествоМесяцев,
   РАЗНОСТЬДАТ(&Дата1, &Дата2, ГОД) КАК КоличествоЛет
2 Не Печенкин
 
08.11.11
10:56
а никак, понятие месяц - это "неправильная" единица измерения, кстати в банках она не применяется, там четко пишется 91 день например
3 SeraFim
 
08.11.11
10:59
(1) запросом не хочется, ибо идет в цикле через com-соединение
+ если действовать так, то получится (например):
15 месяцев 20 дней
26 месяцев 17 дней
11 месяцев 11 дней
Итого:
52 месяца и 48 дней
и что с этими 48 днями делать?
писать, как 53 месяца и 18 дней или 53 месяца и 17 дней?
4 asady
 
08.11.11
11:02
(3) 48 дней делишь на 30.4
5 guitar_player
 
08.11.11
11:03
Если МассивОшибок = Неопределено Тогда
       МассивОшибок = Новый Массив;
   КонецЕсли;
   
   РезультатРасчета = Новый Структура("Лет, Месяцев, Дней", 0, 0, 0);
   
   //Инициализация вспомогательных переменных
   нСтроки        = 1;
   ЛетСтажаП        = 0;
   МесяцевСтажаП    = 0;
   ДнейСтажаП        = 0;
   ЛетСтажаУ        = 0;
   МесяцевСтажаУ    = 0;
   ДнейСтажаУ        = 0;
   КолУвольнений    = 0;    
   ДатаУвольненияСПрошлогоМестаРаботы = Неопределено;
   
   //2. Подсчитываем суммарный стаж работы.
   Для Каждого СтрокаСтажа Из ТрудоваяДеятельность Цикл
       
       //Учитываем только корректные строки
       Если СтрокаСтажа.ДатаОкончания >= СтрокаСтажа.ДатаНачала Тогда
           
           Если ДатаУвольненияСПрошлогоМестаРаботы = Неопределено Или СтрокаСтажа.ДатаНачала > ДатаУвольненияСПрошлогоМестаРаботы Тогда    
       
               ЛетСтажаП        = ЛетСтажаП + Год(СтрокаСтажа.ДатаНачала);
               МесяцевСтажаП    = МесяцевСтажаП + Месяц(СтрокаСтажа.ДатаНачала);                
               ДнейСтажаП        = ДнейСтажаП + День(СтрокаСтажа.ДатаНачала);
               
           Иначе
               
               ЛетСтажаП        = ЛетСтажаП + Год(ДатаУвольненияСПрошлогоМестаРаботы);                
               МесяцевСтажаП    = МесяцевСтажаП + Месяц(ДатаУвольненияСПрошлогоМестаРаботы);                
               ДнейСтажаП        = ДнейСтажаП + День(ДатаУвольненияСПрошлогоМестаРаботы);                
               
           КонецЕсли;
           
           ЛетСтажаУ        = ЛетСтажаУ + Год(СтрокаСтажа.ДатаОкончания);            
           МесяцевСтажаУ    = МесяцевСтажаУ + Месяц(СтрокаСтажа.ДатаОкончания);
           ДнейСтажаУ        = ДнейСтажаУ + День(СтрокаСтажа.ДатаОкончания);                    
           
           КолУвольнений = ?(СтрокаСтажа.БКС_НеУчитыватьДеньУвольнения, КолУвольнений, КолУвольнений + 1);
           
           ДатаУвольненияСПрошлогоМестаРаботы = СтрокаСтажа.ДатаОкончания + 86400;
           
       Иначе        
           МассивОшибок.Добавить("У физического лица " + ФИОФизЛица + " в строке № " + нСтроки + " информация о прошлом месте работы введена неверно.");
           Возврат РезультатРасчета;
       КонецЕсли;
       
       нСтроки = нСтроки + 1;        
       
   КонецЦикла;
   
   //Согласно правилу "Постановление Правительства РФ №555 от 24.07.2002"
   //каждые 30 дней переводятся в месяцы, каждые 12 месяцев в полные года  
   
   Дней = ДнейСтажаУ - ДнейСтажаП + КолУвольнений + ДобавитьДней;
   ЦелыхМесВДнях = Цел(Дней/30);
   КоличествоДней = Дней - ЦелыхМесВДнях*30;
   Если КоличествоДней < 0 Тогда
       ЦелыхМесВДнях = ЦелыхМесВДнях - 1;
       КоличествоДней = 30 + КоличествоДней;        
   КонецЕсли;
   
   Месяцев = МесяцевСтажаУ - МесяцевСтажаП + ЦелыхМесВДнях + ДобавитьМесяцев;
   ЦелыхЛетВМес = Цел(Месяцев/12);                
   КоличествоМес = Месяцев - ЦелыхЛетВМес*12;
   Если КоличествоМес < 0 Тогда
       ЦелыхЛетВМес = ЦелыхЛетВМес - 1;
       КоличествоМес = 12 + КоличествоМес;    
   КонецЕсли;
       
   КоличествоЛет = ЛетСтажаУ - ЛетСтажаП + ЦелыхЛетВМес + ДобавитьЛет;
   
   РезультатРасчета.Лет        = КоличествоЛет;
   РезультатРасчета.Месяцев    = КоличествоМес;
   РезультатРасчета.Дней        = КоличествоДней;
       
   Возврат РезультатРасчета;


откуда то выдрано
6 kn
 
08.11.11
11:12
могу кинуть обработку, которая когда-то в ЗиК считала непрерывный стаж использовалась функция глРазобратьРазностьДат
7 SeraFim
 
08.11.11
12:38
(5) спасибо, особенно за ссылку на Постановление.
(6) буду очень признателен. мыло в личке добавил :)
8 kn
 
08.11.11
12:41
(7)отправлено
9 SeraFim
 
08.11.11
12:42
(8)большое спасибо!
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан