Книга знаний

1С:Предприятие / Приемы программирования / Дата, время

Как получить дату отстоящую от заданной на определенное количество рабочих дней

Вот возникла задача такая
<br>"Как получить дату отстоящую от заданной на определенное количество рабочих дней"
<br>хотелось сделать универсальную функцию.
<br>Работает только в типовых конфигурациях.
Автор статьи:
Последняя редакция №1 от 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;
   Конецесли;    
   Возврат Результат;
КонецФункции    


Как альтернативный вариант (автор butterbean):

////////////////////////////////////////////////////////////////////////////////
//возращает начало первого рабочего дня  который отстоит от заданного дня на указанное количество рабочих дней
Функция ДобавитьКДатеРабочиеДни(ДатаНач,ЧислоРабочихДней) экспорт
   Запрос=Новый Запрос;
   тТекст="ВЫБРАТЬ ПЕРВЫЕ 0001
   |    Календарь.ДатаКалендаря КАК ДатаКалендаря
   |ПОМЕСТИТЬ ТЗ
   |ИЗ
   |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
   |ГДЕ
   |    Календарь.ДатаКалендаря >= &ДатаНач
   |    И (Календарь.ВидДня = &РабочийДень
   |            ИЛИ Календарь.ВидДня = &ПредпраздничныйДень)
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    МАКСИМУМ(ТЗ.ДатаКалендаря) КАК ДатаКалендаря
   |ИЗ
   |    ТЗ КАК ТЗ";

       Запрос.Текст = СтрЗаменить(тТекст,"0001",XMLСтрока(ЧислоРабочихДней));
   Запрос.УстановитьПараметр("ДатаНач",             ДатаНач);
   Запрос.УстановитьПараметр("РабочийДень",         Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
   Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
   Выборка = Запрос.Выполнить().Выбрать();
   Результат = 0;
   Если Выборка.Следующий() Тогда
       Результат = КонецДня(Выборка.ДатаКалендаря)+1;
   Конецесли;    
   Возврат Результат;
КонецФункции    



Обсуждение:
v8: Как получить дату отстоящую от заданной на определенное число рабочих дней (решение)

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика