Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

v8: Как к дате прибавить n дней исключая праздники?

v8: Как к дате прибавить n дней исключая праздники?
Я
   budnik
 
27.11.13 - 14:04
Поскажите как лучше
к начальной дате прибавить n дней исключая праздники.
ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
    РегламентированныйПроизводственныйКалендарь.Год,
    РегламентированныйПроизводственныйКалендарь.Пятидневка,
    РегламентированныйПроизводственныйКалендарь.Шестидневка,
    РегламентированныйПроизводственныйКалендарь.КалендарныеДни,
    РегламентированныйПроизводственныйКалендарь.ВидДня
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    НЕ РегламентированныйПроизводственныйКалендарь.ВидДня = &ВидДня
 
 
   skunk
 
1 - 27.11.13 - 14:06
тебе именно как прибавить

дтНужнаяДата = дтНачальная + чисКоличествоДней * чисКоличествоСекундВДне
   budnik
 
2 - 27.11.13 - 14:10
Праздники надо исключить
   skunk
 
3 - 27.11.13 - 14:12
исключай ...
   1Сергей
 
4 - 27.11.13 - 14:13
дтНужнаяДата = дтНачальная + (чисКоличествоДней - чисКоличествоПраздников) * чисКоличествоСекундВДне
   skunk
 
5 - 27.11.13 - 14:13
точнее наоборот ... если я правильно понимаю ...

смотришь какие праздники и выходные попадают в твой период и делаешь оффсет
   skunk
 
6 - 27.11.13 - 14:14
(4)думаю ему надо на оборот

дтНужнаяДата = дтНачальная + (чисКоличествоДней + чисКоличествоПраздников) * чисКоличествоСекундВДне
   Fragster
 
Модератор
7 - 27.11.13 - 14:14
// добавляет к дате количество рабочих дней по пятидневке/шестидневке/семидневке

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

        |ВЫБРАТЬ ПЕРВЫЕ 1
        |    КусокКалендаря.ДатаКалендаря КАК ДатаКалендаря
        |ИЗ
        |    КусокКалендаря КАК КусокКалендаря
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ КусокКалендаря КАК Накопление
        |        ПО КусокКалендаря.ДатаКалендаря >= Накопление.ДатаКалендаря
        |{ГДЕ
        |    (СУММА(Накопление.Пятидневка) - 1) КАК Пятидневка,
        |    (СУММА(Накопление.Шестидневка) - 1) КАК Шестидневка,
        |    (СУММА(Накопление.КалендарныеДни) - 1) КАК КалендарныеДни}
        |
        |СГРУППИРОВАТЬ ПО
        |    КусокКалендаря.ДатаКалендаря
        |
        |УПОРЯДОЧИТЬ ПО
        |    ДатаКалендаря";
    ИначеЕсли КоличествоДней < 0 Тогда
        Построитель.Текст =
        "ВЫБРАТЬ
        |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря,
        |    РегламентированныйПроизводственныйКалендарь.Пятидневка,
        |    РегламентированныйПроизводственныйКалендарь.Шестидневка,
        |    РегламентированныйПроизводственныйКалендарь.КалендарныеДни
        |ПОМЕСТИТЬ КусокКалендаря
        |ИЗ
        |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        |ГДЕ
        |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &Дата2 И &Дата1
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    ДатаКалендаря
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ ПЕРВЫЕ 1
        |    КусокКалендаря.ДатаКалендаря КАК ДатаКалендаря
        |ИЗ
        |    КусокКалендаря КАК КусокКалендаря
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ КусокКалендаря КАК Накопление
        |        ПО КусокКалендаря.ДатаКалендаря <= Накопление.ДатаКалендаря
        |{ГДЕ
        |    (-СУММА(Накопление.Пятидневка) + 1) КАК Пятидневка,
        |    (-СУММА(Накопление.Шестидневка) + 1) КАК Шестидневка,
        |    (-СУММА(Накопление.КалендарныеДни) + 1) КАК КалендарныеДни}
        |
        |СГРУППИРОВАТЬ ПО
        |    КусокКалендаря.ДатаКалендаря
        |
        |УПОРЯДОЧИТЬ ПО
        |    ДатаКалендаря УБЫВ";
    ИначеЕсли КоличествоДней = 0 Тогда
        Возврат НачальнаяДата;
    Иначе
        ВызватьИсключение "Неверное количество добавляемых дней";
    КонецЕсли;
    Построитель.Параметры.Вставить("Дата1", НачальнаяДата);
    КолНедель = Цел(КоличествоДней / РабочихДней) + ?(КоличествоДней > 0, 1, -1);
    КолЛет =    Цел(КолНедель / 52)               + ?(КоличествоДней > 0, 1, -1);
    Добавляем = КолНедель * 7 + КолЛет * 20;// с запасом, например для майских праздников или новогодних каникул, допустим, у нас праздничных дней 20 в году


    Построитель.Параметры.Вставить("Дата2", НачальнаяДата + 86400*Добавляем);
    
    Если РабочихДней = 5 Тогда
        ЭлементОтбора = Построитель.Отбор.Добавить("Пятидневка");
    ИначеЕсли РабочихДней = 6 Тогда
        ЭлементОтбора = Построитель.Отбор.Добавить("Шестидневка");
    ИначеЕсли РабочихДней = 7 Тогда
        ЭлементОтбора = Построитель.Отбор.Добавить("КалендарныеДни");
    Иначе
        ВызватьИсключение "Неверное количество рабочих дней";
    КонецЕсли;
    ЭлементОтбора.Установить(Цел(КоличествоДней), Истина);
    Построитель.Выполнить();
    Если Построитель.Результат.Пустой() Тогда
        ВызватьИсключение "Не могу определить дату с учетом регламентированного календаря!";
    Иначе
        Выборка = Построитель.Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.ДатаКалендаря;
    КонецЕсли;
КонецФункции
   Feunoir
 
8 - 27.11.13 - 14:16
ЗаполнениеДокументов.ОпределитьДату(ДатаНач, ЧислоДней) 

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

//регламентированным производственным календарем
//

//Параметры:
// ДатаНач      - начальная дата

// ЧислоДней    - количество рабочих дней, на которое искомая дата должна отстоять от начальной
//
   budnik
 
9 - 27.11.13 - 14:48
Спасибо.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.