gifts2017

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

Опубликовал Семен Буханов (semenich_b) в раздел Программирование - Практика программирования

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

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


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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. white mount (white-mount) 08.09.16 20:44
Для создания документов "задним числом" или для отчётов?
2. Алекс Кон (alex-l19041) 09.09.16 15:49
запрос возвращает все рабочие дни с начала года по ДатаНачала. А ведь требуется только одна дата...
3. Семен Семеныч (Razrab1c) 09.09.16 19:20
(2) alex-l19041, при чем тут запрос? Автор публикует функцию, она вроде бы возвращает то что нужно. Читайте внимательнее код.
4. Алекс Кон (alex-l19041) 12.09.16 12:35
(3) Razrab1c, просто было бы интересно, если бы удалось решить одним запросом...
5. Антон Рощин (wolfsoft) 14.09.16 08:19
(4) alex-l19041, ну как-то так

выбрать все рабочие даты меньше указанной
поместить ВсеРабочиеДаты

выбрать Минимум(Дата)
Из
(выбрать первые [НужноеКоличествоРабочихДней]
из ВсеРабочиеДаты
упорядочить по убыванию даты)
Razrab1c; yghmd; Serj1C; +3 Ответить
6. vadim vadim (fvadim) 14.09.16 10:09
скучно. я в запросе отбирал рабочие даты до нужной, нумеровал по порядку и вычитал необходимое количество дней из номера. просто мне эти даты нужны были дальше в запросе.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа