Имя: Пароль:
1C
1С v8
Подсчет рабочего времени с точностью до секунды, между двумя датами
,
0 sereka0908
 
23.12.14
10:46
Я новичок, есть задание, ломаю голову: Имеется регистр сведений «ПроизводственныйКалендарь», который хранит в себе свойства дней (рабочий, выходной, предвыходной), две даты, которые мы выбираем сами, справочник пользователи, который хранит в себе дату начала работы для пользователя, период обеда и дату окончания рабочего дня. Какой алгоритм действий мне необходим?
1 sereka0908
 
23.12.14
10:48
И еще момент, как реализовать это в форме внешней обработки?
2 Cube
 
23.12.14
10:48
Дата1 - Дата2 пробовал уже?
3 Cube
 
23.12.14
10:49
(1) Эргономично, инновационно и с душой :)
4 Alex S D
 
23.12.14
10:49
(2) а выходные дни?
5 vicof
 
23.12.14
10:49
предвыходной?)) пятница что ли?
6 Timon1405
 
23.12.14
10:50
самое интересное будет при подсчетах, когда обычный день 10:00-18:00, предвыходной день 10:00-17:00, а обед 16:30 - 17:30
7 sereka0908
 
23.12.14
10:53
Обычный день с 8:00 до 17:00, обед с 12:00 до 13:00, есть некоторые люди, которые работают с 9 до 18 и обед с 13 до 14, выхходные суббота и воскресенье, предпраздничные -  короткий день, т.е. по 7часов + обед, и это перед красными днями календаря.
8 Alex S D
 
23.12.14
10:54
и нахрен тут период обеда, если он у всех 1 ч.?
9 Cube
 
23.12.14
10:55
(7) Ну вот и решай сам. Для новичка задача самое то. Если сам не решишь - не ту профессию ты выбрал...
10 sereka0908
 
23.12.14
10:55
(8) Просто дату для подсчета можно выбрать например 23.12.2014 12:30:00
11 Timon1405
 
23.12.14
10:56
>> какой алгоритм действий мне необходим?
напомнило
— Куда мне отсюда идти?
— А куда ты хочешь попасть?
— А мне все равно, только бы попасть куда-нибудь.
— Тогда все равно куда идти. Куда-нибудь ты обязательно попадешь©
12 Жан Пердежон
 
23.12.14
10:56
напиши сам хоть что-нибудь
13 Oleg_ka
 
23.12.14
10:59
(0) Автор у Вас онкология структуры данных третье степени.
14 Иде я?
 
23.12.14
11:05
Не забываем перенос праздничных дней.
15 Иде я?
 
23.12.14
11:06
А также еще графики работы, сокращенный день для кормящих матерей и по инвалидности
16 Иде я?
 
23.12.14
11:07
Автор - из более старшой даты вычти более свежую и получишь время в секундах. Или не получишь...Тут как бит выпадет
17 sereka0908
 
25.12.14
12:19
Дата1 – Начальная дата   Дата2 – Конечная дата
1.    Выбираем даты.
2.    Выбираем необходимого пользователя.
3.    Выбираем из Справочника Пользователи необходимые поля(Наименование, НачалоРабочегоВремени, КонецРабочегоВремени, НачалоОбеда, КонецОбеда).
4.    Если поля НачалоРабочегоВремени, КонецРабочегоВремени, НачалоОбеда, КонецОбеда – пустые, то устанавливаем их 09:00, 18:00, 13:00 и 14:00 соответственно.
5.    Задаем Дата3=НачалоДня(Дата1).
6.    Дата3=НачалоДня(Дата1);
7.    Отработано=0;
8.    Если НачРабВр = 8.00 Тогда
    У=Дата3+8*3600,
    П=Дата3+12*3600,
    О=Дата3+13*3600,
    К=Дата3+17*3600
Иначе  
    У=Дата3+9*3600,
    П=Дата3+13*3600,
    О=Дата3+14*3600,
    К=Дата3+18*3600.


9.    Делаем выборку из РегистраСведений  Производственный Календарь, где Вид «Рабочий» и «Предпраздничный», в интервале Дата3 и Дата1.

10.    Если (НачРабВр = 8.00)//рабочий день начинается с 8, Тогда (Если Вид= «Рабочий» Тогда )
18 hhhh
 
25.12.14
12:25
в общем тупо берешь сумму всех дней из производственного календаря.

а потом вычитаешь за первый и последний день, время, которое не входит в период.
19 sereka0908
 
26.12.14
02:04
есть уже дальнейший алгоритм, но испытываю затруднения, с подсчетом, когда обе даты выбраны в один день
20 sereka0908
 
26.12.14
02:04
1Если (НачРабВр = 8.00) 1Тогда (2Если Вид= «Рабочий» 2Тогда (3Если

Дата3<>Дата4 3Тогда(4Если (У<=Дата1<П) 4Тогда ОтработаноВремени=

ОтработаноВремени+(П-Дата1)+4*3600 4Иначе (5Если О<=Дата1<К 5Тогда

ОтработаноВремени= ОтработаноВремени+(К-Дата1) 5Иначе (6Если Дата1<У 6Тогда

ОтработаноВремени= ОтработаноВремени+8*3600 6Иначе (7Если П<=Дата1<О 7Тогда

ОтработаноВремени= ОтработаноВремени+4*3600  

7КонецЕсли)6КонецЕсли)5КонецЕсли)4КонецЕсли) //один и тот же день=?\\ 3Иначе

(8Если (У<=Дата1<П и Дата2<П) 8Тогда ОтработаноВремени=

ОтработаноВремени+(Дата2-Дата1) 8Иначе (9Если (О<=Дата1<К и Дата2<К) 9Тогда

ОтработаноВремени= ОтработаноВремени+(Дата2-Дата1) 9Иначе (10Если (Дата1<У и

Дата2>К) 10Тогда ОтработаноВремени= ОтработаноВремени+8*3600 10Иначе
21 ИС-2
 
naïve
26.12.14
07:27
(20) начинал когда-то писать подобный запрос.
ЧасКонРабДня - время окончания рабочего дня
ДатаНач, ДатаКон - интервал за который надо вычислить.

Этот запрос надо еще подпилить - учитывать время начала рабочего дня

ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
    ВЫБОР
        КОГДА НАЧАЛОПЕРИОДА(&Датанач, ДЕНЬ) = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
            ТОГДА ВЫБОР
                    КОГДА ЧАС(&Датанач) < &ЧасКонРабДня
                        ТОГДА РАЗНОСТЬДАТ(&Датанач, ДОБАВИТЬКДАТЕ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ЧАС, &ЧасКонРабДня), СЕКУНДА)
                    ИНАЧЕ 0
                КОНЕЦ
        ИНАЧЕ 8 * 60 * 60
    КОНЕЦ КАК РабочихСекунд,
    ДОБАВИТЬКДАТЕ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, ЧАС, &ЧасКонРабДня) КАК ВремяКонРабДня
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНач, ДЕНЬ) И КОНЕЦПЕРИОДА(&ДатаКон, ДЕНЬ)
    И РегламентированныйПроизводственныйКалендарь.ВидДня В(&РабочиеДни)