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



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

Как добавить рабочие дни к дате?
Я
   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) Ну, вообще, он нормальный, если еще не нужно картошку на кухне почистить, да.
Мы как бы вообще про сабж говорим, а не про функцию на все случаи жизни.

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


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