Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как получить количество календарных месяцев между двумя датами
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > База знаний > Наши статьи > 1С Предприятие 8
Vofka
Создаю эту тему, как результат исследований исходя из необходимо зарегистрироваться для просмотра ссылки темы.

Способ первый. Не мой, а из типовой конфигурации, считает по идее не только месяцы, но я проверял только на месяцах:

Процедура РазобратьРазностьДат(Дата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;
    КонецЕсли;
    
    Возврат РазностьВМесяцах;
    
КонецФункции


Вроде оба отрабатывают корректно smile.gif
Acid
Цитата(Vofka @ 01.06.12, 14:18) необходимо зарегистрироваться для просмотра ссылки
РАЗНОСТЬДАТ(&КонечнаяДата, &НачальнаяДата, МЕСЯЦ)

пардон. даты попутал...
Vofka
Acid, а?
Plsergey
Нехай буде для довідки
КоличествоМесяцев =  (Месяц(ДатаОкончания) + 12*Год(ДатаОкончания))-(Месяц(ДатаНачала)    + 12*Год(ДатаНачала))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.