Привет всем!
Сегодня я расскажу, как легко и без проблем вычислить разницу между двумя датами с заданной периодичностью.
Например, сколько дней между 01.02.2018 и 31.12.2018? Или, сколько недель между 08.08.2018 и 31.12.2018?
Итак, начнем:
В конфигураторе создаем внешнюю обработку. Назовем ее «ВычислитьРазницуМеждуДатами»
Добавим форму и откроем ее.
Добавим на форму несколько реквизитов:
1. Периодичность тип (ПеречислениеСсылка.Периодичность)
2. ДатаНачала и ДатаОкончания тип (Дата)
3. РазностьДата тип (Строка) Заголовок, для удобства, будет «Разность между датами дн.»
Все это добавляем на форму в том порядке, как это удобно для восприятия:
Добавляем команду «ВычислитьРазницуДат» на форму, в командную панель.
Теперь перейдем, собственно, к программированию… Создаем действие для нашей единственной команды:

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


