Вход | Регистрация



Как добавить рабочие дни к дате?

Как добавить рабочие дни к дате?
Я
   DTX 4th
 
21.09.16 - 16:49
Как лучше сделать?
Речь не про запрос.
 
 
   Nuobu
 
1 - 21.09.16 - 16:52
Лучше сделать запросом.
   DTX 4th
 
2 - 21.09.16 - 16:54
(1) С мильярдом соединений и подсчетом порядкового номера дня нарастающим итогом?
   mikecool
 
3 - 21.09.16 - 16:54
(2) d nbgjds[ tcnm HC GhjbpdjlcndtyysqRfktylfhm
   NcSteel
 
4 - 21.09.16 - 16:54
(2) Зачем, в типовых есть РС производственный календарь, с ним и соединяй
   mikecool
 
5 - 21.09.16 - 16:55
+3 в типовых есть РС ПроизводственныйКалендарь
   PR2
 
6 - 21.09.16 - 16:55
(1) Не добавишь
   Nuobu
 
7 - 21.09.16 - 16:56
(6) Чё это?
Есть производственный календарь. Ставь отбор на график работы и вперёд.
   Timon1405
 
8 - 21.09.16 - 16:56
(4)(5) +там есть ресурс "вид дня", по нему и брать
   DTX 4th
 
9 - 21.09.16 - 17:00
(4) Так это понятно, но думал, что его придётся с самим собой соединять. И при этом непонятно, как ограничить сверху по дате..
Но потом вот тут
Книга знаний: Как получить дату отстоящую от заданной на определенное количество рабочих дней
наткнулся на альтернативный вариант от butterbean. Возьму его, спасибо.
   СамыйУмный
 
10 - 21.09.16 - 17:00
+(5) Поддержку пацанов, делай через
РегистрыСведений.РегламентированныйПроизводственныйКалендарь
 
 Рекламное место пустует
   PR2
 
11 - 21.09.16 - 17:02
(7) Че че это?
Как ты прибавишь к 1 мая 3 дня?
А как к 31 декабря 10 дней?
А 300 дней как прибавишь?
   СамыйУмный
 
12 - 21.09.16 - 17:02
Функция ЭтоРабочийДень(ПроверяемаяДата = Неопределено) Экспорт
    Если ПроверяемаяДата = Неопределено или ПроверяемаяДата = Дата(1,1,1) Тогда
        ПроверяемаяДата = ТекущаяДата();
    КонецЕсли;
    НаборЗаписей = РегистрыСведений.РегламентированныйПроизводственныйКалендарь.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ДатаКалендаря.Установить(ПроверяемаяДата);
    НаборЗаписей.Прочитать();
    Если НаборЗаписей.Количество() > 0 Тогда
        ВидДня = НаборЗаписей[0].ВидДня;
        Если ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий или ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный Тогда
            Возврат Истина;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    Иначе
        Возврат Истина;
    КонецЕсли;
    
КонецФункции
   СамыйУмный
 
13 - 21.09.16 - 17:04
А потом так:

Функция ДобавитьКДатеРабочиеДни(ПередаваемаяДата = Неопределено, КоличествоРабочихДней) Экспорт
    
    Если ПередаваемаяДата = Неопределено или ПередаваемаяДата = Дата(1,1,1) Тогда
        ПередаваемаяДата = ТекущаяДата();
    КонецЕсли;

    СледующийДень = НачалоДня(ПередаваемаяДата);
    //СледующийДень = ПередаваемаяДата+60*60*24;

    Пропущено = 0;
    
    СЦ=0;
    Для СЦ = 1 По КоличествоРабочихДней Цикл 
        СледующийДень = СледующийДень+60*60*24;
        Если НЕ ЭтоРабочийДень(СледующийДень) Тогда
            Пропущено = Пропущено+1;
        КонецЕсли;
    КонецЦикла;
    
    Если Пропущено<>0 Тогда
        СледующийДень = ДобавитьКДатеРабочиеДни(СледующийДень,Пропущено);
    КонецЕсли;
    
    Возврат СледующийДень;
    
КонецФункции
   Nuobu
 
14 - 21.09.16 - 17:05
(11) Это и дураку понятно, что число к дате не прибавится.
   NcSteel
 
15 - 21.09.16 - 17:09
(12) Жалко Сталина на тебя нет
   PR2
 
16 - 21.09.16 - 17:10
(14) Рукалицо
Причем здесь прибавление числа к дате, что, кстати, даже дураку понятно, что вполне себе прибавится, что бы, собственно, нет-то?
Я говорю, как ты одним запросом поймешь, сколько записей из производственного календаря тебе выбирать?
   PR2
 
17 - 21.09.16 - 17:11
(12) За такое в приличном обществе морду бьют.
Долго. С оттяжкой. Чтобы понял и запомнил.
   СамыйУмный
 
18 - 21.09.16 - 17:12
(15) и (16) Ухахах, вы такие смешные!
Зато у вас это сделать невозможно, сидите дальше, в своих приличных обществах
   Slypower
 
19 - 21.09.16 - 17:12
в 1с7.7 я использую:
Функция КоличесвтоРабочихДней(НачДата,КолвоДней)  Экспорт        //на основаниее глБанковскихДней

    Перем БанковскихДней, ОбычныхДней, ДеньНедели;
    Праздник = СоздатьОбъект("Праздники"); 
    БанковскихДней = 0;
    ОбычныхДней    = 0;
    Пока БанковскихДней < КолвоДней Цикл 
        ОбычныхДней = ОбычныхДней+ 1;
        
        // определим день недели

        ДеньНедели=НомерДняНедели(НачДата-ОбычныхДней);  
        
        //sasha       

        КоличествоПраздников = 0;
        Праздник.ВыбратьДаты(НачДата-ОбычныхДней,НачДата-ОбычныхДней);
        Пока Праздник.СледующаяДата() = 1 Цикл
            КоличествоПраздников = КоличествоПраздников + 1;
        КонецЦикла;
        //sasha 

        
        // если не выходной, то прошел еще один банковский день

        Если ДеньНедели < 6 Тогда 
            Если КоличествоПраздников = 0 Тогда
                БанковскихДней=БанковскихДней+1; 
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат (НачДата - ОбычныхДней);
    
КонецФункции//КоличесвтоДней()



а потом уже:

КоличесвтоРабочихДней(ДатаДок,3);// где 3 -  количество раб дней
   PR2
 
20 - 21.09.16 - 17:15
(18) Чукча не читатель, явно.
Невозможно _одним_ запросом.
Точнее и одним запросом возможно, просто тупо выбрать весь производственный календарь до скончания веков. Типа либо нам хватит дней либо производственный календарь не заполнен и задача невыполнима.
Но это как бы нихрена неоптимально для прибавления тех же трех дней к примеру.
   NcSteel
 
21 - 21.09.16 - 17:16
(18) Как раз я знаю как это сделать и используя один запрос, а не запрос в цикле, как у тебя...
За твой подход на сертификации спеца ставят неуд.
   NcSteel
 
22 - 21.09.16 - 17:16
(20) Границу можно рассчитать... не сложно
   PR2
 
23 - 21.09.16 - 17:16
(19) Ну и ты красавец, че, в цикле хреначишь, хоть бы хрен
   PR2
 
24 - 21.09.16 - 17:17
(22) Да ты че. И как же?
   СамыйУмный
 
25 - 21.09.16 - 17:17
(21) Ну напиши тогда если знаешь, выложи свой код мы тоже посмеемся))
   NcSteel
 
26 - 21.09.16 - 17:18
(24) Хотя бы так:
(КоличествоДнейПрибавить / 7 +1) + СамыйДлинныйПраздник.

Что то в этом роде.
   NcSteel
 
27 - 21.09.16 - 17:19
   NcSteel
 
28 - 21.09.16 - 17:19
(25) смотри ссылку в (9)
   PR2
 
29 - 21.09.16 - 17:19
(26) Маладес. Прибавь 356 дней.
   NcSteel
 
30 - 21.09.16 - 17:21
(29) ну
52 + 10 = 62

Итого надо взять (356 + 62) дней, примерно
   NcSteel
 
31 - 21.09.16 - 17:22
(30) Можно даже вычислить количество праздничных дней в году и его прибавлять...

В общем без проблем рассчитывается
   NcSteel
 
32 - 21.09.16 - 17:22
(31) даже ввести максимальное количество раб дней в году... в общем без проблем
   PR2
 
33 - 21.09.16 - 17:24
(27) Второй вариант неплох, да, определенно
 
 
   PR2
 
34 - 21.09.16 - 17:25
(30) С хрена ли 356 + 62, если у тебя получается 62?
   NcSteel
 
35 - 21.09.16 - 17:27
(34) 62 это сколько надо прибавить к количеству дней.... но так как в твоем варианте примерно два года рабочих, то надо раза в два больше брать....

А проще рассчитать коэффициентр рабочих дней и хранить его в константе
   PR2
 
36 - 21.09.16 - 17:28
   NcSteel
 
37 - 21.09.16 - 17:29
(36) Он нормальный если не надо в запросе определить раб. даты по таблице...
   PR2
 
38 - 21.09.16 - 17:36
(37) Ну, вообще, он нормальный, если еще не нужно картошку на кухне почистить, да.
Мы как бы вообще про сабж говорим, а не про функцию на все случаи жизни.

Кроме того, возможно, что даже в этом случае пакетный запрос решит проблему.


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