Книга знаний

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

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

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

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