Каталог решений - Вычитание рабочих дней от текущей даты

Вычитание рабочих дней от текущей даты

Вычитание рабочих дней от текущей даты

В наличии

Функция возвращает дату, которая меньше указанной даты на количество рабочих дней по выбранному графику

Категория:

Описание

В общем модуле БСП КалендарныеГрафики есть функции, которые позволяют получить даты по календарю, но все они выполняются со сдвигом «вправо», то есть позволяют получить дату после той, что была передана. Я написал простенькую функцию, которая позволяет получить рабочий день по календарю ранее переданной даты со сдвигом на указанное количество рабочих дней. Может, кому-то и будет полезно.


// Функция возвращает дату, которая меньше указанной даты на количество рабочих дней по выбранному графику
//
// Параметры
//	Календарь		- календарь, который необходимо использовать, тип СправочникСсылка.Календари
//	ДатаНачала			- дата, от которой нужно рассчитать количество дней, тип Дата
//	КоличествоДней	- количество дней, на которые нужно уменьшить дату начала, тип Число
//	ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного календаря
//  НеУчитыватьДатуНачала - Булево, если Истина,  берётся предыдущая рабочая дата, если ложь, то учитывается сама дата начала
//
// Возвращаемое значение
//	Дата			- дата, уменьшенная на количество рабочих дней по графику
//	Если выбранный календарь не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено
//
Функция ПолучитьПредыдущуюРабочуюДатуПоКалендарю(Календарь, ДатаНачала, КоличествоДней, НеУчитыватьДатуНачала=Ложь,  ВызыватьИсключение=Истина) экспорт
	Если НЕ ЗначениеЗаполнено(Календарь) И  ВызыватьИсключение Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ИскомаяДата = Дата(1,1,1);
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика
	|ИЗ
	|	РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики
	|ГДЕ
	|	КалендарныеГрафики.Календарь = &Календарь
	|	И КалендарныеГрафики.Год = &Год
	|	И КалендарныеГрафики.ДеньВключенВГрафик = ИСТИНА
	|	И КалендарныеГрафики.ДатаГрафика <= &ДатаГрафика
	|
	|УПОРЯДОЧИТЬ ПО
	|	ДатаГрафика УБЫВ";
	Запрос.УстановитьПараметр("Календарь",Календарь);
	Запрос.УстановитьПараметр("Год",Год(ДатаНачала));
	Запрос.УстановитьПараметр("ДатаГрафика",ДатаНачала);
	
	Выгрузка = Запрос.Выполнить().Выгрузить();
	
	//проверим, что начальная дата входит в график, если не входит, то текущий день учитывать нельзя!
	МассивДат = Выгрузка.НайтиСтроки(Новый Структура("ДатаГрафика",ДатаНачала));
	Если МассивДат.Количество() =0 Тогда // не входит! переопределим НеУчитыватьДатуНачала  в ложь!
		НеУчитыватьДатуНачала = Ложь;
	КонецЕсли;		
	
	ИскомаяДата = Выгрузка[КоличествоДней - ?(НеУчитыватьДатуНачала,0,1)].ДатаГрафика; 
	
	Возврат ИскомаяДата;
КонецФункции // ПолучитьПредыдущуюРабочуюДатуПоКалендарю()

has been added to your cart:
Оформление заказа