Версия для печати темы (https://pro1c.org.ua/index.php?s=01c32308fbc992ca841db4d1e72d7be1&showtopic=7616)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ 1С Предприятие 8 _ Как получить количество календарных месяцев между двумя датами

Автор: Vofka 01.06.12, 13:18

Создаю эту тему, как результат исследований исходя из 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;
    КонецЕсли;
    
    Возврат РазностьВМесяцах;
    
КонецФункции


Вроде оба отрабатывают корректно smile.gif

Автор: Acid 30.06.16, 10:18

Цитата(Vofka @ 01.06.12, 14:18) *
РАЗНОСТЬДАТ(&КонечнаяДата, &НачальнаяДата, МЕСЯЦ)

пардон. даты попутал...

Автор: Vofka 30.06.16, 11:06

Acid, а?

Автор: Plsergey 19.02.24, 14:28

Нехай буде для довідки

КоличествоМесяцев =  (Месяц(ДатаОкончания) + 12*Год(ДатаОкончания))-(Месяц(ДатаНачала)    + 12*Год(ДатаНачала))

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua