Обработка «Вычислить разницу между датами» (1С Предприятие)

Привет всем!

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

Например, сколько дней между 01.02.2018 и 31.12.2018? Или, сколько недель между 08.08.2018 и 31.12.2018?

Итак, начнем:

В конфигураторе создаем внешнюю обработку. Назовем ее «ВычислитьРазницуМеждуДатами»
Добавим форму и откроем ее.
2018-09-12_12-32-08Добавим на форму несколько реквизитов:
1. Периодичность тип (ПеречислениеСсылка.Периодичность)
2. ДатаНачала и ДатаОкончания тип (Дата)
3. РазностьДата тип (Строка) Заголовок, для удобства, будет «Разность между датами дн.»

Все это добавляем на форму в том порядке, как это удобно для восприятия:
2018-09-12_12-43-25Добавляем команду «ВычислитьРазницуДат» на форму, в командную панель.

Теперь перейдем, собственно, к программированию… Создаем действие для нашей единственной команды:
2018-09-12_12-46-25
и далее, пишем такой код:

&НаСервере
Процедура ВычислитьНаСервере(РазностьДат2)
    Периодичность = ЭтаФорма.Периодичность;
    НачалоПериода = ЭтаФорма.ДатаНачала ;
    КонецПериода = ЭтаФорма.ДатаОкончания;
    РазностьДат2 = РазностьДат(НачалоПериода, КонецПериода, Периодичность);
КонецПроцедуры

&НаКлиенте
Процедура ВычислитьРазницуДат(Команда)
    Если  ЗначениеЗаполнено(ЭтаФорма.Периодичность) Тогда
        РазностьДат2 = 0;
        ВычислитьНаСервере(РазностьДат2);
        ЭтотОбъект.РазностьДат = Строка(РазностьДат2);
    Иначе
        Сообщить("Заполни периодичность");
        Возврат
    КонецЕсли;
КонецПроцедуры

Ниже напишем код Функции, которая, собственно, и будет считать искомую разницу.

Функция РазностьДат(ДатаНачала, ДатаОкончания, Периодичность) Экспорт
    СекундВМинуте = 60;
    МинутВЧасе = 60;
    ЧасовВДне = 24;
    Если Периодичность = Перечисления.Периодичность.Год Тогда
        Возврат Год(ДатаОкончания) - Год(ДатаНачала);
    ИначеЕсли Периодичность = Перечисления.Периодичность.Полугодие Тогда
        Возврат ?(Месяц(ДатаОкончания)>6, 2, 1) - ?(Месяц(ДатаНачала)>6, 2, 1) + 2*(Год(ДатаОкончания) - Год(ДатаНачала));
    ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда
        Возврат Цел(Месяц(НачалоКвартала(ДатаОкончания))/3) - Цел(Месяц(НачалоКвартала(ДатаНачала))/3) + 4*(Год(ДатаОкончания) - Год(ДатаНачала));
    ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда
        Возврат Месяц(ДатаОкончания) - Месяц(ДатаНачала) + 12*(Год(ДатаОкончания) - Год(ДатаНачала));
    ИначеЕсли Периодичность = Перечисления.Периодичность.Декада Тогда
        Возврат Цел((ДатаОкончания - ДатаНачала)/(10 * СекундВМинуте*МинутВЧасе*ЧасовВДне));
    ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда
        Возврат Цел((НачалоНедели(ДатаОкончания) - НачалоНедели(ДатаНачала))/(7 * СекундВМинуте*МинутВЧасе*ЧасовВДне));
    ИначеЕсли Периодичность = Перечисления.Периодичность.День Тогда
        Возврат (ДатаОкончания - ДатаНачала)/(СекундВМинуте*МинутВЧасе*ЧасовВДне);
    КонецЕсли;
    
КонецФункции

В итоге, получаем вот такой результат:
2018-09-12_12-58-43

2018-09-12_12-58-34

2018-09-12_12-58-22