Получить разницу дат в [секундах, минутах, днях, ...]
Теги: 1С,Дата

Получает разницу дат в указанной единице изменения

# Код реализации

```1c
// Получение запросом

// Возращает разницу переданных дат в указанном типе разницы
//
// Параметры:
//  МеньшаяДата 	- Меньшая (Начальная) дата, к примеру дата документа
//  БольшаяДата 	- Большая (Конечная) дата, к примеру текущая дата
//  Тип		- Тип разницы, поддерживается: секунда, минута, час, день, неделя, месяц, год
//	ВыбиратьБольшуюДатуПервой - В случае если в качестве меньшей даты, указана большая, можно ли их поменять местами
//
// Порядок указания дат не пренципиален, функция сама определит какая из дат большая.
// По умолчанию тип разницы "день".
// Указывать тип можно в любом регистре.
// Возращает целое число!
//
Функция ПолучитьРазницуДатВ(Знач МеньшаяДата, Знач БольшаяДата, Тип = "день", ВыбиратьБольшуюДатуПервой = Истина) Экспорт

	Тип = НРег(Тип);

	Если МеньшаяДата > БольшаяДата и ВыбиратьБольшуюДатуПервой Тогда

		ВремДата = БольшаяДата;
		БольшаяДата = МеньшаяДата;
		МеньшаяДата = ВремДата;

	ИначеЕсли БольшаяДата = МеньшаяДата Тогда

		Возврат 0;

	КонецЕсли;

	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда Возврат БольшаяДата - МеньшаяДата;
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда Тип = "МИНУТА"
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда Тип = "ЧАС"
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда Тип = "ДЕНЬ"
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда Тип = "НЕДЕЛЯ"
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда Тип = "МЕСЯЦ"
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда Тип = "ГОД"
	Иначе Возврат 0;
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("БольшаяДата", БольшаяДата);
	Запрос.УстановитьПараметр("МеньшаяДата", МеньшаяДата);
	Запрос.УстановитьПараметр("ВидСравнения", Тип);
	Запрос.Текст= "ВЫБРАТЬ РАЗНОСТЬДАТ(&МеньшаяДата, &БольшаяДата, ДЕНЬ) КАК Разница";
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ДЕНЬ", Тип);
	Выборка = Запрос.Выполнить().Выбрать();

	Возврат ?(Выборка.Следующий(), ?(Выборка.Разница <> Null, Выборка.Разница, 0), 0);

КонецФункции

// На клиенте

// Возращает разницу переданных дат в указанном типе разницы
//
// Параметры:
//  МеньшаяДата 	- Меньшая (Начальная) дата, к примеру дата документа
//  БольшаяДата 	- Большая (Конечная) дата, к примеру текущая дата
//  Тип		- Тип разницы, поддерживается: секунда, минута, час, день, неделя, месяц, год
//	ВыбиратьБольшуюДатуПервой - В случае если в качестве меньшей даты, указана большая, можно ли их поменять местами
//
// Порядок указания дат не пренципиален, функция сама определит какая из дат большая.
// По умолчанию тип разницы "день".
// Указывать тип можно в любом регистре.
// Возращает целое число!
//
Функция ПолучитьРазницуДатВ(Знач МеньшаяДата, Знач БольшаяДата, Тип = "день", ВыбиратьБольшуюДатуПервой = Истина) Экспорт

	Тип = НРег(Тип);

	Если МеньшаяДата > БольшаяДата и ВыбиратьБольшуюДатуПервой Тогда

		ВремДата = БольшаяДата;
		БольшаяДата = МеньшаяДата;
		МеньшаяДата = ВремДата;

	ИначеЕсли БольшаяДата = МеньшаяДата Тогда

		Возврат 0;

	КонецЕсли;

	Разница = БольшаяДата - МеньшаяДата;

	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда
		Возврат Разница;
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда
		Возврат Цел(Разница / 60);
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда
		Возврат Цел(Разница / (60*60));
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда
		Возврат Цел(Разница / (60*60*24));
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда
		Возврат Цел(Разница / (60*60*24*7));
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда
		Возврат Цел(Разница / (60*60*24*30));
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда
		Возврат Цел(Разница / (60*60*24*365));
	Иначе
		Возврат 0;
	КонецЕсли;

КонецФункции
```