Привет всем!
Сегодня я расскажу, как легко и без проблем вычислить разницу между двумя датами с заданной периодичностью.
Например, сколько дней между 01.02.2018 и 31.12.2018? Или, сколько недель между 08.08.2018 и 31.12.2018?
Итак, начнем:
В конфигураторе создаем внешнюю обработку. Назовем ее «ВычислитьРазницуМеждуДатами»
Добавим форму и откроем ее.
Добавим на форму несколько реквизитов:
1. Периодичность тип (ПеречислениеСсылка.Периодичность)
2. ДатаНачала и ДатаОкончания тип (Дата)
3. РазностьДата тип (Строка) Заголовок, для удобства, будет «Разность между датами дн.»
Все это добавляем на форму в том порядке, как это удобно для восприятия:
Добавляем команду «ВычислитьРазницуДат» на форму, в командную панель.
Теперь перейдем, собственно, к программированию… Создаем действие для нашей единственной команды:
и далее, пишем такой код:
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 * СекундВМинуте*МинутВЧасе*ЧасовВДне)); ИначеЕсли Периодичность = Перечисления.Периодичность.День Тогда Возврат (ДатаОкончания - ДатаНачала)/(СекундВМинуте*МинутВЧасе*ЧасовВДне); КонецЕсли; КонецФункции |
В итоге, получаем вот такой результат: