Как добавить рабочие дни к дате
Задача добавление рабочих дней к дате (добавить рабочие дни к дате) встречается довольно часто. И штатно должна решаться с помощью стандартного функционала БСП — «Производственный календарь». Например так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Функция ДобавитьКДатеРабочиеДни(ДатаНач,ЧислоРабочихДней) экспорт Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ | ВЫБОР | КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень | ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК ЧислоРабочихДней, | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря |ПОМЕСТИТЬ ТЗ |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ.ДатаКалендаря, | СУММА(ТЗ1.ЧислоРабочихДней) КАК ЧислоРабочихДней |ПОМЕСТИТЬ ТЗНакопл |ИЗ | ТЗ КАК ТЗ | ЛЕВОЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ1 | ПО (ТЗ1.ДатаКалендаря <= ТЗ.ДатаКалендаря) | |СГРУППИРОВАТЬ ПО | ТЗ.ДатаКалендаря |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | МАКСИМУМ(ТЗ.ДатаКалендаря) КАК ДатаКалендаря |ИЗ | ТЗНакопл КАК ТЗ |ГДЕ | ТЗ.ЧислоРабочихДней = &ЧислоРабочихДней"; Запрос.УстановитьПараметр("ДатаНач", ДатаНач); ЧислоНедель = Цел(ЧислоРабочихДней/5+0.5); ЧислоВыходныхДней = ЧислоНедель*2; МаксимальноеКоличествоПраздничныхДнейПодряд = 8; //РождественскиеКаникулы ДатаКон = ДатаНач+(ЧислоВыходныхДней+ЧислоРабочихДней+МаксимальноеКоличествоПраздничныхДнейПодряд)*24*60*60; Запрос.УстановитьПараметр("ДатаКон",ДатаКон); Запрос.УстановитьПараметр("ЧислоРабочихДней",ЧислоРабочихДней); Запрос.УстановитьПараметр("РабочийДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный); Выборка = Запрос.Выполнить().Выбрать(); Результат = 0; Если Выборка.Следующий() Тогда Результат = КонецДня(Выборка.ДатаКалендаря)+1; Конецесли; Возврат Результат; КонецФункции |
Однако не всё же не все конфигурации содержат производственный календарь. Например почему-то обделено Делопроизводство 2.0. Что-бы не городить огород,, решил задачу «в лоб», без учёта праздничных дней — просто проверяю выпадение даты на субботу-воскресенье. В моём случае этого хватило.
1 2 3 4 5 6 7 8 9 10 |
Функция ДобавитьКДатеРабочиеДни(ДатаПроверки,дней) добавлено=0; пока добавлено<>дней цикл ДатаПроверки=ДатаПроверки+86400; Если ДеньНедели(ДатаПроверки) <> 6 ИЛИ ДеньНедели(ДатаПроверки) <> 7 Тогда добавлено=добавлено+1; конецесли; конеццикла; Возврат ДатаПроверки; КонецФункции |
Другие статьи по теме 1С, можно почитать тут