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

Функция КоличесвтоРабочихДней(НачДата,КолвоДней)  Экспорт         //на основаниее глБанковскихДней
    Перем БанковскихДней, ОбычныхДней, ДеньНедели;
    Праздник = СоздатьОбъект("Праздники");
    БанковскихДней = 0;
    ОбычныхДней    = 0;
    Пока БанковскихДней < КолвоДней Цикл
        ОбычныхДней = ОбычныхДней+ 1;
        
        // определим день недели
        ДеньНедели=НомерДняНедели(НачДата-ОбычныхДней);  
        
        //sasha      
        КоличествоПраздников = 0;
        Праздник.ВыбратьДаты(НачДата-ОбычныхДней,НачДата-ОбычныхДней);
        Пока Праздник.СледующаяДата() = 1 Цикл
            КоличествоПраздников = КоличествоПраздников + 1;
        КонецЦикла;
        //sasha
        
        // если не выходной, то прошел еще один банковский день
        Если ДеньНедели < 6 Тогда
            Если КоличествоПраздников = 0 Тогда
                БанковскихДней=БанковскихДней+1;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат (НачДата - ОбычныхДней);
    
КонецФункции //КоличесвтоДней()


а потом уже:

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

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

52 + 10 = 62

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

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

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

Кроме того, возможно, что даже в этом случае пакетный запрос решит проблему.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс