#6 Аналоги функций ДобавитьКДате и РазностьДат языка запросов

Дата: 26.10.2025 15:29:37
Дата
Комментарий:
0
Конфигурация:
Любая
Формы:
Любые
Код:
                        //.
// Возвращаемое значение:
//   Структура - значения положительны для месячных типов и отрицательны для секундных
Функция МножителиТиповПериодов() Экспорт
	Сутки = 24*60*60;
	Множители = Новый Структура("Год, Полугодие, Квартал, Месяц,    Декада,   Неделя,     День,    Час, Минута, Секунда",
			                     12,          6,       3,     1, -10*Сутки, -7*Сутки, -1*Сутки, -60*60,    -60,      -1);
	Возврат Множители;
КонецФункции 

// Аналог функции ДобавитьКДате языка запросов.
// Параметры:
//   ИсходнаяДата - Дата - 
//   ТипПериода - Строка - имя типа периода аналогично языку запросов, регистр букв не важен
//   Количество - Число - допускается отрицательное
// Возвращаемое значение:
//   Дата - 
Функция ДобавитьКДате(Знач ИсходнаяДата, Знач ТипПериода, Знач Количество = -1) Экспорт
	ТипПериода = ВРег(ТипПериода);
	Если Найти("ГОД;КВАРТАЛ;ПОЛУГОДИЕ;МЕСЯЦ;", ТипПериода + ";") > 0 Тогда
		Если Цел(Количество) <> Количество Тогда
			ВызватьИсключение "Количество должно быть целым числом для типа периода " + ТипПериода;
		КонецЕсли;
	КонецЕсли;
	Множители = МножителиТиповПериодов();
	Если Не Множители.Свойство(ТипПериода) Тогда
		ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
	КонецЕсли;
	Если Множители[ТипПериода] > 0 Тогда
		Возврат ДобавитьМесяц(ИсходнаяДата, Количество * Множители[ТипПериода]);
	Иначе
		Возврат ИсходнаяДата - Количество * Множители[ТипПериода];
	КонецЕсли;
КонецФункции 

// Аналог функции РазностьДат языка запросов.
// Параметры:
//   ВычитаемаяДата - Дата - которую вычитаем
//   ИсходнаяДата - Дата - из которой вычитаем
//   ТипПериода - Строка - имя типа периода аналогично языку запросов, регистр букв не важен
// Возвращаемое значение:
//   Число - ИсходнаяДата-ВычитаемаяДата
Функция РазностьДат(Знач ВычитаемаяДата, Знач ИсходнаяДата, Знач ТипПериода) Экспорт
	Множители = МножителиТиповПериодов();
	Если Не Множители.Свойство(ТипПериода) Тогда
		ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
	КонецЕсли;
	Если Множители[ТипПериода] > 0 Тогда
		Возврат Цел((Год(ИсходнаяДата)   * 12 + Месяц(ИсходнаяДата)   - 1) / Множители[ТипПериода])
			  - Цел((Год(ВычитаемаяДата) * 12 + Месяц(ВычитаемаяДата) - 1) / Множители[ТипПериода])
	Иначе
		Возврат Цел((Дата(1,1,1) - ИсходнаяДата)   / Множители[ТипПериода])
			  - Цел((Дата(1,1,1) - ВычитаемаяДата) / Множители[ТипПериода])
	КонецЕсли;
КонецФункции
                    

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1c-only | Фриланс © 2025