Создаю эту тему, как результат исследований исходя из
этой темы.
Способ первый. Не мой, а из типовой конфигурации, считает по идее не только месяцы, но я проверял только на месяцах:
Процедура РазобратьРазностьДат(Дата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))));
КонецЕсли;
КонецЕсли;
КонецПроцедуры // РазобратьРазностьДат
А вот мой способ:
Функция РазностьДатВМесяцах(Знач НачальнаяДата, Знач КонечнаяДата)
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(&КонечнаяДата, &НачальнаяДата, МЕСЯЦ) КАК РазностьВМесяцах
|";
Запрос.УстановитьПараметр("НачальнаяДата", НачальнаяДата);
Запрос.УстановитьПараметр("КонечнаяДата", КонечнаяДата);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
РазностьВМесяцах = Выборка.РазностьВМесяцах;
Если День(КонечнаяДата) > День(НачальнаяДата) Тогда
РазностьВМесяцах = РазностьВМесяцах - 1;
КонецЕсли;
Возврат РазностьВМесяцах;
КонецФункции
Вроде оба отрабатывают корректно
Сообщение отредактировал Vofka - 01.06.12, 13:19