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

08.09.16

Разработка - Универсальные функции

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

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


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

Вступайте в нашу телеграмм-группу Инфостарт

рабочий день получение рабочего дня вычитание рабочего дня предыдущая рабочая дата по календарю

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4470    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8273    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    55169    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7864    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    69811    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9834    ke.92@mail.ru    17    

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

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

выбрать Минимум(Дата)
Из
(выбрать первые [НужноеКоличествоРабочихДней]
из ВсеРабочиеДаты
упорядочить по убыванию даты)
olia.moo; tdml; top_1c; Razrab1c; yghmd; Serj1C; +6 Ответить
6. fvadim 10 14.09.16 10:09 Сейчас в теме
скучно. я в запросе отбирал рабочие даты до нужной, нумеровал по порядку и вычитал необходимое количество дней из номера. просто мне эти даты нужны были дальше в запросе.
7. pepe 64 15.07.20 17:37 Сейчас в теме
(5)Так работать не будет. Последовательность выполнения запроса 1С: "Сначала выполняется расчет агрегатных функций без группировки, затем команды ПЕРВЫЕ <ХХ>– Упорядочить По" https://infostart.ru/public/527529/?detail=Y
Проверил, все так и работает, как в статье! Идея прикольная, но не работает.
8. pepe 64 15.07.20 17:46 Сейчас в теме
Данный запрос не будет работать с началом года, например мы хотим получить
ПолучитьПредыдущуюРабочуюДатуПоКалендарю(Календарь, 02.01.2020, 7, Ложь, Истина)
процедура упадет с ошибкой, я понимаю Автора, он хочет уменьшить выборку только этим годом, но это приводит к ошибке. Я сам сейчас столкнулся с данной задачей и думаю как решить!
9. 2sl 23.06.25 16:29 Сейчас в теме
Основной вопрос в том, что нужно ограничить количество выбираемых записей из выборки, чтобы запрос не ушел в бесконечное выполнение. Легко решается с помощью схемы запроса.
Из самого запроса при этом убираем условие на "&Год".
Перед выполнение запроса после текста вставляем такую обработку:

СхемаЗапроса = Новый СхемаЗапроса();
	СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
	СхемаЗапроса.ПакетЗапросов[0].Операторы[0].КоличествоПолучаемыхЗаписей = КоличествоДней;
	Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();


Также, признак включения дня в выборку или исключения предпочтительно сделать в самом условии запроса:
 "|	И ВЫБОР КОГДА &НеУчитыватьДатуНачала
             |           ТОГДА КалендарныеГрафики.ДатаГрафика < &ДатаГрафика
             |            ИНАЧЕ КалендарныеГрафики.ДатаГрафика <= &ДатаГрафика
             |	КОНЕЦ" 
Для отправки сообщения требуется регистрация/авторизация