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

Опубликовано 12.09.2018, in 1C, автор: Лямкин Андрей

Привет всем!

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

Например, сколько дней между 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
и далее, пишем такой код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&НаСервере
Процедура ВычислитьНаСервере(РазностьДат2)
    Периодичность = ЭтаФорма.Периодичность;
    НачалоПериода = ЭтаФорма.ДатаНачала ;
    КонецПериода = ЭтаФорма.ДатаОкончания;
    РазностьДат2 = РазностьДат(НачалоПериода, КонецПериода, Периодичность);
КонецПроцедуры
 
&НаКлиенте
Процедура ВычислитьРазницуДат(Команда)
    Если  ЗначениеЗаполнено(ЭтаФорма.Периодичность) Тогда
        РазностьДат2 = 0;
        ВычислитьНаСервере(РазностьДат2);
        ЭтотОбъект.РазностьДат = Строка(РазностьДат2);
    Иначе
        Сообщить("Заполни периодичность");
        Возврат
    КонецЕсли;
КонецПроцедуры

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

21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Функция РазностьДат(ДатаНачала, ДатаОкончания, Периодичность) Экспорт
    СекундВМинуте = 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

Comments are closed.

Яндекс.Метрика