Создаю эту тему, как результат исследований исходя из http://pro1c.org.ua/index.php?showtopic=7613 темы.
Способ первый. Не мой, а из типовой конфигурации, считает по идее не только месяцы, но я проверял только на месяцах:
Процедура РазобратьРазностьДат(Дата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;
КонецЕсли;
Возврат РазностьВМесяцах;
КонецФункции
Acid, а?
Нехай буде для довідки
КоличествоМесяцев = (Месяц(ДатаОкончания) + 12*Год(ДатаОкончания))-(Месяц(ДатаНачала) + 12*Год(ДатаНачала))
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua