Книга знаний |
|
1С:Предприятие / Приемы программирования / Дата, время |
|
Вот возникла задача такая
"Как получить дату отстоящую от заданной на определенное количество рабочих дней" хотелось сделать универсальную функцию. Работает только в типовых конфигурациях. | Автор статьи: asady | Редакторы: Последняя редакция №4 от 14.09.10 | История URL: http://kb.mista.ru/article.php?id=809 |
//возращает начало первого рабочего дня который отстоит от заданного дня на указанное количество рабочих днейФункция ДобавитьКДатеРабочиеДни(ДатаНач,ЧислоРабочихДней) экспорт Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ | ВЫБОР | КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень | ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК ЧислоРабочихДней, | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря |ПОМЕСТИТЬ ТЗ |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ.ДатаКалендаря, | СУММА(ТЗ1.ЧислоРабочихДней) КАК ЧислоРабочихДней |ПОМЕСТИТЬ ТЗНакопл |ИЗ | ТЗ КАК ТЗ | ЛЕВОЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ1 | ПО (ТЗ1.ДатаКалендаря <= ТЗ.ДатаКалендаря) | |СГРУППИРОВАТЬ ПО | ТЗ.ДатаКалендаря |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | МАКСИМУМ(ТЗ.ДатаКалендаря) КАК ДатаКалендаря |ИЗ | ТЗНакопл КАК ТЗ |ГДЕ | ТЗ.ЧислоРабочихДней = &ЧислоРабочихДней"; Запрос.УстановитьПараметр("ДатаНач", ДатаНач); ЧислоНедель = Цел(ЧислоРабочихДней/5+0.5); ЧислоВыходныхДней = ЧислоНедель*2; МаксимальноеКоличествоПраздничныхДнейПодряд = 8; //РождественскиеКаникулы ДатаКон = ДатаНач+(ЧислоВыходныхДней+ЧислоРабочихДней+МаксимальноеКоличествоПраздничныхДнейПодряд)*24*60*60; Запрос.УстановитьПараметр("ДатаКон",ДатаКон); Запрос.УстановитьПараметр("ЧислоРабочихДней",ЧислоРабочихДней); Запрос.УстановитьПараметр("РабочийДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный); Выборка = Запрос.Выполнить().Выбрать(); Результат = 0; Если Выборка.Следующий() Тогда Результат = КонецДня(Выборка.ДатаКалендаря)+1; Конецесли; Возврат Результат; КонецФункции
//////////////////////////////////////////////////////////////////////////////// //возращает начало первого рабочего дня который отстоит от заданного дня на указанное количество рабочих дней Функция ДобавитьКДатеРабочиеДни(ДатаНач,ЧислоРабочихДней) экспорт Запрос=Новый Запрос; тТекст="ВЫБРАТЬ ПЕРВЫЕ 0001 | Календарь.ДатаКалендаря КАК ДатаКалендаря |ПОМЕСТИТЬ ТЗ |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь |ГДЕ | Календарь.ДатаКалендаря >= &ДатаНач | И (Календарь.ВидДня = &РабочийДень | ИЛИ Календарь.ВидДня = &ПредпраздничныйДень) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | МАКСИМУМ(ТЗ.ДатаКалендаря) КАК ДатаКалендаря |ИЗ | ТЗ КАК ТЗ"; Запрос.Текст = СтрЗаменить(тТекст,"0001",XMLСтрока(ЧислоРабочихДней)); Запрос.УстановитьПараметр("ДатаНач", ДатаНач); Запрос.УстановитьПараметр("РабочийДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный); Выборка = Запрос.Выполнить().Выбрать(); Результат = 0; Если Выборка.Следующий() Тогда Результат = КонецДня(Выборка.ДатаКалендаря)+1; Конецесли; Возврат Результат; КонецФункции
Описание
| Рубрикатор
| Поиск
| ТелепатБот
| Захваченные статьи
| Установки
| Форум
|