Код 1C v 8.х
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
Лет = 0 ;
Месяцев = 0 ;
Дней = 0 ;
Если Дата1 > Дата2 Тогда
ВременнаяДата = Дата1 ;
Если День( ВременнаяДата) < День( Дата2 ) Тогда
Дней = ( ВременнаяДата - ДобавитьМесяц( ВременнаяДата, - 1 ) ) / 86400 ;
ВременнаяДата = ДобавитьМесяц( ВременнаяДата, - 1 ) ;
КонецЕсли ;
Если Месяц( ВременнаяДата) < Месяц( Дата2 ) Тогда
ВременнаяДата = ДобавитьМесяц( ВременнаяДата, - 12 ) ;
Месяцев = 12 ;
КонецЕсли ;
Лет = Макс( Год( ВременнаяДата) - Год( Дата2 ) , 0 ) ;
Месяцев = Макс( Месяцев + Месяц( ВременнаяДата) - Месяц( Дата2 ) , 0 ) ;
Дней = Макс( Дней + День( ВременнаяДата) - День( Дата2 ) , 0 ) ;
Если Дата2 < > ( ДобавитьМесяц( Дата1 , - Лет * 12 - Месяцев) - Дней * 86400 ) Тогда
Дней = Дней + ( День( КонецМесяца( Дата2 ) ) - День( НачалоМесяца( Дата2 ) ) ) - ( День( КонецМесяца( ДобавитьМесяц( Дата1 , - 1 ) ) ) - День( НачалоМесяца( ДобавитьМесяц( Дата1 , - 1 ) ) ) ) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
Вычисление периодов в формате ГГММДД. Вычисление дат по формуле Дата + ГГММДД.
Примечание: Даты передаем в виде 'ДД.ММ.ГГГГ', периоды - "ГГ-ММ-ДД".
Пользуйтесь.
arithmometr
Код 1C v 7.x
Функция зпГлСтрокуВЧисло(стр) Экспорт
стр1 = СокрЛП( стр) ;
Чис1 = "" ;
Для х = 1 По СтрДлина( стр1 ) Цикл
Чис1 = Чис1 + Число( Сред( стр1 , х, 1 ) ) ;
КонецЦикла ;
Чис = Число( Чис1 ) ;
Возврат Чис;
КонецФункции
Функция зпГлВычислитьСрок(Аргум1,Аргум2="" ,Парам="" ) Экспорт
Перем ЗнВозврата;
Если ( Парам= 0 ) Тогда
Дата1 = Мин( Дата( Аргум1 ) , Дата( Аргум2 ) ) ;
Дата2 = Макс( Дата( Аргум1 ) , Дата( Аргум2 ) ) ;
Мес = ( ДатаГод( Дата2 ) - ДатаГод( Дата1 ) ) * 12 + ( ДатаМесяц( Дата2 ) - ДатаМесяц( Дата1 ) ) ;
Дни = ДатаЧисло( Дата2 ) - ДатаЧисло( Дата1 ) ;
Если ( Дни < 0 ) Тогда
Мес = Мес - 1 ;
Дни = Дни + ДатаЧисло( КонМесяца( Дата1 ) ) ;
КонецЕсли ;
Если ( Дни > = ДатаЧисло( КонМесяца( Дата2 ) ) ) и ( Дата2 = КонМесяца( Дата2 ) ) Тогда
Мес = Мес + 1 ;
Дни = 0 ;
КонецЕсли ;
Лет = Цел( Мес/ 12 ) ;
Мес = Мес - Лет* 12 ;
ЗнВозврата = Формат( Лет, "Ч(0)2.0" ) + "-" + Формат( Мес, "Ч(0)2.0" ) + "-" + Формат( Дни, "Ч(0)2.0" ) ;
ИначеЕсли ( Число( Парам) * Число( Парам) = 1 ) Тогда
Дата1 = Дата( Аргум1 ) ;
Аргум2 = зпГлВычислитьСрок( Аргум2 ) ;
Срок = Аргум2 ;
Мес = Число( Лев( Срок, 2 ) ) * 12 + Число( Сред( Срок, 4 , 2 ) ) ;
Дни = Число( Прав( Срок, 2 ) ) ;
Дата2 = ДобавитьМесяц( Дата1 , Парам* Мес) ;
Если ( Дата1 = КонМесяца( Дата1 ) ) Тогда
Дни = Мин( ДатаЧисло( КонМесяца( Дата2 ) ) - 1 , Дни) ;
ИначеЕсли ( Дни > = ДатаЧисло( КонМесяца( Дата2 ) ) * ( ( 1 - Парам) / 2 ) - Парам* ДатаЧисло( Дата2 ) ) Тогда
Дни = Мин( ДатаЧисло( КонМесяца( ДобавитьМесяц( Дата2 , 1 ) ) ) - 1 , Дни) ;
КонецЕсли ;
ЗнВозврата = Дата2 + Парам* Дни;
Иначе
Если ( Найти( Парам, "+" ) > 0 ) Тогда
Срок1 = зпГлСтрокуВЧисло( СтрЗаменить( Аргум1 + "." , "-" , "" ) ) / 10 ;
Срок2 = зпГлСтрокуВЧисло( СтрЗаменить( Аргум2 + "." , "-" , "" ) ) / 10 ;
Дни = Срок1 %100 + Срок2 %100 ;
Мес = Цел( ( Срок1 %10000 + Срок2 %10000 - Дни) / 1000 ) ;
Лет = Цел( Срок1 / 10000 ) + Цел( Срок2 / 10000 ) ;
Мес = Мес + Цел( Дни/ 30 ) ;
Дни = Дни%30 ;
Лет = Лет + Цел( Мес/ 12 ) ;
Мес = Мес%12 ;
Иначе
Срок = зпГлСтрокуВЧисло( СтрЗаменить( Аргум1 + "." , "-" , "" ) ) / 10 ;
Мес = Цел( Срок/ 100 ) - Цел( Срок/ 10000 ) * ( 100 - 12 ) ;
Дни = Мин( Срок - Цел( Срок/ 100 ) * 100 , 30 ) ;
Лет = Цел( Мес/ 12 ) ;
Мес = Мес - Лет* 12 ;
КонецЕсли ;
Если ( Найти( Парам, "П" ) > 0 ) Тогда
ЗнВозврата = "років " + Лет+ ", місяців " + Мес+ ", днів " + Дни;
ИначеЕсли ( Найти( Парам, "К" ) > 0 ) Тогда
ЗнВозврата = "" + Лет+ "р." + Мес+ "м." + Дни+ "д." ;
Иначе
ЗнВозврата = Формат( Лет, "Ч(0)2.0" ) + "-" + Формат( Мес, "Ч(0)2.0" ) + "-" + Формат( Дни, "Ч(0)2.0" ) ;
КонецЕсли ;
КонецЕсли ;
Возврат ЗнВозврата;
КонецФункции