Доброго времени суток. Недавно на форуме увидел в очередной раз обсуждение кода для вычисления разницы двух дат (не в запросе) для размещения в форме в виде табло: Лет, Месяцев, Дней. Для отображения количества промежутка времени в стаже, контракта, например. Как выражаются мои бухгалтеры: калькулятор. Для "обратного" действия от тоже работает.
В БСП такой функции не обнаружил, с переводом в запрос (там есть нужная функция) получается "громоздко". Захотелось сделать своё, без проверок и условий, что-то более "изящное". Получилось вроде неплохо, обратил внимание, что функция ДобавитьМесяц() работает очень корректно, например при переходе через февраль месяц (начальная дата, например, 30 января, конечная дата - 30 марта). Этим и воспользовался.
Привожу код функции.
Пару слов: обрабатываю в примере два интервала: в русском языке есть два понятия - с/по и с/до! В соответствии с этим обрабатываю конечную дату.
Проверял на платформе 8.3 (8.3.12.1924), но думаю, работать будет везде.
PS. Благодаря "бдительности"
подкорректировал код + нашел неточность (пометил на примере кода: кто скачивал - исправляйте)
Функция ПолучениеРазницыДат (ДатаС, ДатаПо, ДатаДо)
Если ДатаПо <> Дата('00010101') Тогда
ДатаОкон = ДатаПо;
ДеньКоррекции = 3600*24; //для корректировки даты ПО
ИначеЕсли ДатаДо <> Дата('00010101') Тогда
ДатаОкон = ДатаДо;
ДеньКоррекции = 0;
Иначе
НовСообщ = Новый СообщениеПользователю;
НовСообщ.Текст = "Выберите одну дату";
НовСообщ.Сообщить();
КонецЕсли;
РазницаДатыС = День(КонецМесяца(ДатаС)) - День(ДатаС); //добавление
КонМесДатыС = КонецМесяца(ДатаС); //добавление
Если ДатаОкон >= ДатаС Тогда
ВремГод = 0; ВремМес = 0; ВремДней = 0;
НоваяДата = ДобавитьМесяц(КонМесДатыС, 12); //исправление
Пока НоваяДата <= ДатаОкон + ДеньКоррекции Цикл
ВремГод = ВремГод + 1;
НоваяДата = ДобавитьМесяц(НоваяДата, 12);
КонецЦикла;
ПромДата = ДобавитьМесяц(НоваяДата, - 12); //ввел промежуточную дату после подсчета лет для
// корректного перехода февраля месяца, если он есть.
НоваяДата = ДобавитьМесяц(ПромДата, 1);
Пока НоваяДата <= ДатаОкон + ДеньКоррекции Цикл
ВремМес = ВремМес + 1;
НоваяДата = ДобавитьМесяц(ПромДата, 1 + ВремМес);
КонецЦикла;
НоваяДата = ДобавитьМесяц(КонМесДатыС, 12*ВремГод + ВремМес); //исправление
ВремДней = РазницаДатыС + ?(Год(ДатаОкон + ДеньКоррекции)=Год(НоваяДата), ДеньГода(ДатаОкон + ДеньКоррекции) - ДеньГода(НоваяДата), ДеньГода(КонецГода(НоваяДата)) - ДеньГода(НоваяДата) + ДеньГода(ДатаОкон + ДеньКоррекции)); //добавление
Возврат "" + ВремГод + "/" + ВремМес + "/" + ВремДней;
Иначе
НовСообщ = Новый СообщениеПользователю;
НовСообщ.Текст = "Проверьте формат дат";
НовСообщ.Сообщить();
КонецЕсли;
КонецФункции