Имя: Пароль:
1C
1С v8
Разбить периоды в запросе
,
0 location
 
naïve
22.03.17
14:51
Добрый день уважаемые форумчане. Подскажите плз как можно разбить период в запросе.

Т.е. есть несколько периодов работы сотрудника. Необходимо исключить из этих периодов, те периоды когда сотрудник находился в определенном состоянии.

Например
Сотрудник1 имеет период работы с 07.12.15 по 31.12.16
и имеет еще один период работы с 01.01.17 по 01.03.17

далее имеет периоды состояния работника 02.06.16 по 19.06.16, данный период попадает в наш первый период работы поэтому все нормально

а второй период по состояния с 20.06.16 по 01.03.17, вот этот период не попадает, и чтобы его исключить необходимо как то разбить периоды, чтобы он попал в период работы.

пробовал сделать что то такое, но попадает только 1 период по состояниям, как я не крутил даты ничего не получилось. подскажите плз.

ВЫБРАТЬ
    ВТПериодыРаботников.ФизЛицо,
    ВТПериодыРаботников.ДатаНач,
    ВТПериодыРаботников.ДатаКон,
    ВТПериодыСостояний.ДатаНачСостояния,
    ВТПериодыСостояний.ДатаКонцаСостояния
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериодыСостояний КАК ВТПериодыСостояний
        ПО ВТПериодыРаботников.ФизЛицо = ВТПериодыСостояний.ФизЛицо
            И (ВТПериодыРаботников.ДатаНач <= ВТПериодыСостояний.ДатаНачСостояния
                И ВТПериодыСостояний.ДатаНачСостояния <= ВТПериодыРаботников.ДатаКон)
            И (ВТПериодыРаботников.ДатаКон >= ВТПериодыСостояний.ДатаКонцаСостояния
                И ВТПериодыСостояний.ДатаКонцаСостояния >= ВТПериодыРаботников.ДатаНач)
1 СвинТуз
 
22.03.17
14:57
Так похоже на вытеснение.
2 mistеr
 
22.03.17
15:00
(0) Поточнее объясни, какой результат должен быть, на твоем примере хотя бы. Нужно из первого набора периодов исключить периоды из второго набора?
3 location
 
naïve
22.03.17
15:05
(2) да либо исключить, либо период работника разбить чтобы дата начала совпадала с датой начала состояния и дата конца аналогично, когда у нас затрагивает несколько периодов по сотруднику.
4 Alexandr_U1982
 
22.03.17
15:12
(0) Вам нужно построить подобную таблицу
07.12.2015   02.06.2016
02.06.2016   19.06.2016
19.06.2016   20.06.2016
20.06.2016   31.12.2016
01.01.2017   01.03.2017

Затем для каждого интервала нужно получить состояние, и затем по состоянию сотрудников исключить некоторые периоды.
5 Ildarovich
 
22.03.17
15:16
Навскидку:
Я бы
1) развернул периоды на дни (соединением с производственным календарем),
2) нашел те дни, когда попадает в первый, не попадает во второй и любые более сложные условия,
3) а затем соединил бы оставшиеся дни опять в непрерывные периоды (http://catalog.mista.ru/public/306536/ Задача 14).
6 location
 
naïve
22.03.17
15:39
(4) как построить подобную таблицу?
7 Alexandr_U1982
 
22.03.17
15:56
(6)
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТПериодыРаботников.Физлицо КАК Физлицо,
    ВТПериодыРаботников.ДатаНач КАК Период
ПОМЕСТИТЬ ВТПериоды
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыРаботников.Физлицо,
    ВТПериодыРаботников.ДатаКон
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаНачСостояния
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаКонцаСостояния
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период КАК ДатаНачала,
    МИНИМУМ(ВТПериоды_2.Период) КАК ДатаОкончания
ИЗ
    ВТПериоды КАК ВТПериоды_1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды_2
        ПО ВТПериоды_1.Физлицо = ВТПериоды_2.Физлицо
            И ВТПериоды_1.Период < ВТПериоды_2.Период
ГДЕ
    НЕ ВТПериоды_2.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период
8 xxTANATORxx
 
22.03.17
16:17
не знаю всей ситуации, но я бы смотрел в сторону (1)
9 location
 
naïve
22.03.17
16:18
(7) спс большое, но у меня или мозги высушились или я уже совсем нафиг запутался, как теперь для этих интервалов получить состояния?
10 SeraFim
 
22.03.17
16:29
11 location
 
naïve
22.03.17
16:32
(10) там на дату, а тут на период
12 dezss
 
22.03.17
16:58
(7) Я бы чуть модифицировал твой запрос вот так.
Правда тут все равно не решен момент если особый период начался до начала рабочего.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТПериодыРаботников.Физлицо КАК Физлицо,
    ВТПериодыРаботников.ДатаНач КАК Период,
    0 Как Состояние
ПОМЕСТИТЬ ВТПериоды
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыРаботников.Физлицо,
    ВТПериодыРаботников.ДатаКон,
    0
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаНачСостояния
    1
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаКонцаСостояния
    1
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период КАК ДатаНачала,
    МИНИМУМ(ВТПериоды_2.Период) КАК ДатаОкончания
ИЗ
    ВТПериоды КАК ВТПериоды_1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды_2
        ПО ВТПериоды_1.Физлицо = ВТПериоды_2.Физлицо
            И ВТПериоды_1.Период < ВТПериоды_2.Период
ГДЕ
    НЕ ВТПериоды_2.Период ЕСТЬ NULL
    И (ВТПериоды_1.Состояние = 0 ИЛИ ВТПериоды_2.Состояние = 0)

СГРУППИРОВАТЬ ПО
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период
13 dezss
 
22.03.17
16:59
(12) там некоторые зпт пропущены
14 Alexandr_U1982
 
22.03.17
17:05
(9)
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТПериодыРаботников.Физлицо КАК Физлицо,
    ВТПериодыРаботников.ДатаНач КАК Период
ПОМЕСТИТЬ ВТПериоды
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыРаботников.Физлицо,
    ВТПериодыРаботников.ДатаКон
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаНачСостояния
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаКонцаСостояния
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период КАК ДатаНачала,
    МИНИМУМ(ВТПериоды_2.Период) КАК ДатаОкончания
ПОМЕСТИТЬ ВТПериодыСотрудников
ИЗ
    ВТПериоды КАК ВТПериоды_1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды_2
        ПО ВТПериоды_1.Физлицо = ВТПериоды_2.Физлицо
            И ВТПериоды_1.Период < ВТПериоды_2.Период
ГДЕ
    НЕ ВТПериоды_2.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДатыАктуальности.Физлицо,
    ДатыАктуальности.ДатаНачала,
    ДатыАктуальности.ДатаОкончания,
    ВТПериодыСостояний.Состояние
ИЗ
    (ВЫБРАТЬ
        ВТПериодыСотрудников.Физлицо КАК Физлицо,
        ВТПериодыСотрудников.ДатаНачала КАК ДатаНачала,
        ВТПериодыСотрудников.ДатаОкончания КАК ДатаОкончания,
        МАКСИМУМ(ВТПериодыСостояний.ДатаНачСостояния) КАК ДатаАктуальности
    ИЗ
        ВТПериодыСотрудников КАК ВТПериодыСотрудников
            ЛЕВОЕ СОЕДИНЕНИЕ ВТПериодыСостояний КАК ВТПериодыСостояний
            ПО ВТПериодыСотрудников.Физлицо = ВТПериодыСостояний.Физлицо
                И ВТПериодыСотрудников.ДатаНачала >= ВТПериодыСостояний.ДатаНачСостояния
    
    СГРУППИРОВАТЬ ПО
        ВТПериодыСотрудников.Физлицо,
        ВТПериодыСотрудников.ДатаНачала,
        ВТПериодыСотрудников.ДатаОкончания) КАК ДатыАктуальности
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериодыСостояний КАК ВТПериодыСостояний
        ПО ДатыАктуальности.Физлицо = ВТПериодыСостояний.Физлицо
            И ДатыАктуальности.ДатаАктуальности = ВТПериодыСостояний.ДатаНачСостояния
15 Alexandr_U1982
 
22.03.17
17:08
(7) возвращает
ДатаНачала    ДатаОкончания
07.12.2015    02.06.2016
02.06.2016    19.06.2016
19.06.2016    20.06.2016
20.06.2016    31.12.2016
31.12.2016    01.01.2017
01.01.2017    01.03.2017

(12) возвращает
ДатаНачала    ДатаОкончания
07.12.2015    02.06.2016
02.06.2016    31.12.2016
19.06.2016    31.12.2016
20.06.2016    31.12.2016
31.12.2016    01.01.2017
01.01.2017    01.03.2017
16 Alexandr_U1982
 
22.03.17
17:09
(0)Расскажи всю задачу. Для чего это все нужно?
17 dezss
 
22.03.17
17:18
(15) Точна...надо больше параметров. Надо еще признак начала и конца периода проставить и все будет ок.
18 location
 
naïve
23.03.17
07:58
(16) надо посчитать количество рабочих дней за вычетом тех дней где состояние не работает, т.е. отпуск и т.д., плюс надо еще разбить по каждой должности, т.е. необходимо посчитать количество дней по работнику на каждой должности по которой он работал за исключением дней, когда состояние у работника не равно работает.
19 kumena
 
23.03.17
08:48
20 location
 
naïve
23.03.17
08:55
(19) не открывается отчет у меня этот у меня 2,1 зуп
21 dezss
 
23.03.17
08:57
А если вот так:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТПериодыРаботников.Физлицо КАК Физлицо,
    ВТПериодыРаботников.ДатаНач КАК Период,
    0 Как Начало,
    0 Как Состояние
ПОМЕСТИТЬ ВТПериоды
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыРаботников.Физлицо,
    ВТПериодыРаботников.ДатаКон,
    1,
    0
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаНачСостояния,
    1,
    1
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаКонцаСостояния,
    0,
    1
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период КАК ДатаНачала,
    МИНИМУМ(ВТПериоды_2.Период) КАК ДатаОкончания
ИЗ
    ВТПериоды КАК ВТПериоды_1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды_2
        ПО ВТПериоды_1.Физлицо = ВТПериоды_2.Физлицо
            И ВТПериоды_1.Период < ВТПериоды_2.Период
ГДЕ
    НЕ ВТПериоды_2.Период ЕСТЬ NULL
    И (ВТПериоды_1.Состояние = 0 ИЛИ ВТПериоды_2.Состояние = 0)
    И ВТПериоды_1.Начало = 0
    И ВТПериоды_2.Начало = 1

СГРУППИРОВАТЬ ПО
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период
22 kumena
 
23.03.17
08:58
(20)
а ну для 2.1 и не задумывалось, я её почти не застал даже. если хочешь могу доработать для твоей 2.1, но разумеется не на халяву.
и делать лучше через календарь, так проще, по моему. по крайней мере у меня так сделано.
23 location
 
naïve
23.03.17
09:06
(14) не правильно выбирает состояния :( для периодов
24 dezss
 
23.03.17
10:19
(23) а (21) не проверял?
25 location
 
naïve
23.03.17
10:25
(24) в (21) вообще не все периоды берет.
26 Alexandr_U1982
 
23.03.17
10:48
(23) Приведи таблицу, как выбирает состояния запрос. И как должно быть правильно.
27 location
 
naïve
23.03.17
10:53
(26)

выбирает так
Дата начала    Дата окончания   Состояние
07.12.2015     31.12.2016       NULL
01.01.2017     01.03.2017       Отпуск

все больше ничего не выбирает, другие интервалы потерялись.
28 Alexandr_U1982
 
23.03.17
10:53
(23)
Я экспериментировал над периодами работы:
07.12.15 - 31.12.16
01.01.17 - 01.03.17

И периодами отпуска за свой счет:
02.06.16 - 19.06.16
20.06.16 - 01.03.17

Запрос из (14) вернул таблицу:
ДатаНачала    ДатаОкончания    Состояние
07.12.2015    02.06.2016    
02.06.2016    19.06.2016    В отпуске без сохранения зарплаты
19.06.2016    20.06.2016    В отпуске без сохранения зарплаты
20.06.2016    31.12.2016    В отпуске без сохранения зарплаты
31.12.2016    01.01.2017    В отпуске без сохранения зарплаты
01.01.2017    01.03.2017    В отпуске без сохранения зарплаты

В данном примере таблица правильная.
29 Alexandr_U1982
 
23.03.17
10:55
(27)Что у тебя в таблицах "ВТПериодыРаботников" и "ВТПериодыСостояний"?
30 location
 
naïve
23.03.17
11:00
ВТПериодыРаботников

Сотрудник   ДатаНач   Датакон
Сотрудник1  01.01.17  01.03.17
Сотрудник1  07.12.15  31.12.16


ВТПериодыСостояний
Сотрудник   ДатаНач   Датакон
Сотрудник1  02.06.16  09.09.06
Сотрудник1  20.09.06  01.03.17

вот что выбирают временные таблицы
31 location
 
naïve
23.03.17
11:01
(30) интервалы потом выбираются такие же, а вот последний запрос выбирает всего 2 строки
32 Alexandr_U1982
 
23.03.17
11:02
(3)ВТПериодыСостояний
Датакон
09.09.06

Девятое сентября 2006 года!!!
33 location
 
naïve
23.03.17
11:04
(32) ошибся
все верно выбирает.
34 location
 
naïve
23.03.17
11:05
(33) не так скопировал запрос.
35 Alexandr_U1982
 
23.03.17
11:05
(30)Вот полный текст запроса, на котором экспериментирую
Попробуй сравнить результаты формирования каждой временной таблицы

ВЫБРАТЬ
    &Физлицо КАК Физлицо,
    ДАТАВРЕМЯ(2015, 12, 7) КАК ДатаНач,
    ДАТАВРЕМЯ(2016, 12, 31) КАК ДатаКон
ПОМЕСТИТЬ ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Физлицо,
    ДАТАВРЕМЯ(2017, 1, 1),
    ДАТАВРЕМЯ(2017, 3, 1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    &Физлицо КАК Физлицо,
    ДАТАВРЕМЯ(2016, 6, 2) КАК ДатаНачСостояния,
    ДАТАВРЕМЯ(2016, 6, 19) КАК ДатаКонцаСостояния,
    &Состояние КАК Состояние
ПОМЕСТИТЬ ВТПериодыСостояний

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Физлицо,
    ДАТАВРЕМЯ(2016, 6, 20),
    ДАТАВРЕМЯ(2017, 3, 1),
    &Состояние
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТПериодыРаботников.Физлицо КАК Физлицо,
    ВТПериодыРаботников.ДатаНач КАК Период
ПОМЕСТИТЬ ВТПериоды
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыРаботников.Физлицо,
    ВТПериодыРаботников.ДатаКон
ИЗ
    ВТПериодыРаботников КАК ВТПериодыРаботников

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаНачСостояния
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТПериодыСостояний.Физлицо,
    ВТПериодыСостояний.ДатаКонцаСостояния
ИЗ
    ВТПериодыСостояний КАК ВТПериодыСостояний
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период КАК ДатаНачала,
    МИНИМУМ(ВТПериоды_2.Период) КАК ДатаОкончания
ПОМЕСТИТЬ ВТПериодыСотрудников
ИЗ
    ВТПериоды КАК ВТПериоды_1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды_2
        ПО ВТПериоды_1.Физлицо = ВТПериоды_2.Физлицо
            И ВТПериоды_1.Период < ВТПериоды_2.Период
ГДЕ
    НЕ ВТПериоды_2.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    ВТПериоды_1.Физлицо,
    ВТПериоды_1.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДатыАктуальности.Физлицо,
    ДатыАктуальности.ДатаНачала,
    ДатыАктуальности.ДатаОкончания,
    ВТПериодыСостояний.Состояние
ИЗ
    (ВЫБРАТЬ
        ВТПериодыСотрудников.Физлицо КАК Физлицо,
        ВТПериодыСотрудников.ДатаНачала КАК ДатаНачала,
        ВТПериодыСотрудников.ДатаОкончания КАК ДатаОкончания,
        МАКСИМУМ(ВТПериодыСостояний.ДатаНачСостояния) КАК ДатаАктуальности
    ИЗ
        ВТПериодыСотрудников КАК ВТПериодыСотрудников
            ЛЕВОЕ СОЕДИНЕНИЕ ВТПериодыСостояний КАК ВТПериодыСостояний
            ПО ВТПериодыСотрудников.Физлицо = ВТПериодыСостояний.Физлицо
                И ВТПериодыСотрудников.ДатаНачала >= ВТПериодыСостояний.ДатаНачСостояния
    
    СГРУППИРОВАТЬ ПО
        ВТПериодыСотрудников.Физлицо,
        ВТПериодыСотрудников.ДатаНачала,
        ВТПериодыСотрудников.ДатаОкончания) КАК ДатыАктуальности
        ЛЕВОЕ СОЕДИНЕНИЕ ВТПериодыСостояний КАК ВТПериодыСостояний
        ПО ДатыАктуальности.Физлицо = ВТПериодыСостояний.Физлицо
            И ДатыАктуальности.ДатаАктуальности = ВТПериодыСостояний.ДатаНачСостояния
36 Alexandr_U1982
 
23.03.17
11:06
(33)(34)Хорошо
37 location
 
naïve
23.03.17
11:06
(35) я осознал что я нуб.
38 location
 
naïve
23.03.17
11:11
(36) а чтобы назад выбрать для сотрудника его должности и подразделения, я должен таким же методом пользоваться как и для состояний?
39 Alexandr_U1982
 
23.03.17
11:18
(38)Не совсем понял вопрос.
Если на каждый интервал нужно получить должность и подразделение, то можно использовать тот же метод, что и для построения последней таблицы из (35)
40 location
 
naïve
23.03.17
11:20
(39) подожди, а как потом соединить это все вместе, чтобы было должность, подразделение, состояние?
41 location
 
naïve
23.03.17
12:06
(39) для этого случая, правильно интервалы разбил, а для другого получилось не ок.

когда работник увольнялся

работал с 10.09.13 по 02.08.14  и с 27.10.14 по 01.03.17
изначально ВТПериодыСотрудников выдавал 3 интервала в том числе и интервал когда сотрудник был уволен, добавил признак что причина изменения состояния не равно увольнение. но в последнем запросе выдает интервалы
с 10.09.13 по 26.10.14
с 26.10.14 по 27.10.14
с 27.10.14 по 01.03.17

а надо исключить тот период когда он не работал.
42 Alexandr_U1982
 
23.03.17
13:23
В (0) и (18) приведено описание задачи. Отталкиваться будем от этого.
Как я понял, посчитать нужно плановое количество рабочих дней.
Из (0) и (18) непонятно, нужно определить количество рабочих дней по производственному календарю или по графику работы сотрудника?
График работы может не совпадать с производственным календарем, поэтому количество рабочих дней по графику работы и по производственному календарю может получиться разным.
43 Alexandr_U1982
 
23.03.17
13:24
Построение запроса для получения периодов работы сотрудника.

1. Построим таблицу с кадровой историей сотрудника. Допустим таблица будет вот такая:
Период       Сотрудник      Подразделение      Должность      Причина изменения состояния
07.12.2015   Сотрудник 1    Подразделение 1    Должность 1    Прием на работу
01.01.2017   Сотрудник 1    Подразделение 1    Должность 2    Перемещение
01.03.2017   Сотрудник 1    Подразделение 1    Должность 2    Увольнение

Пример запроса:
ВЫБРАТЬ
   РаботникиОрганизаций.Сотрудник,
   РаботникиОрганизаций.Период,
   РаботникиОрганизаций.ПодразделениеОрганизации,
   РаботникиОрганизаций.Должность,
   РаботникиОрганизаций.ПричинаИзмененияСостояния
ПОМЕСТИТЬ ВТКадроваяИстория
ИЗ
   РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
   РаботникиОрганизаций.Сотрудник = &Сотрудник

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   РаботникиОрганизаций.Сотрудник,
   РаботникиОрганизаций.ПериодЗавершения,
   РаботникиОрганизаций.ПодразделениеОрганизацииЗавершения,
   РаботникиОрганизаций.ДолжностьЗавершения,
   РаботникиОрганизаций.ПричинаИзмененияСостоянияЗавершения
ИЗ
   РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
   РаботникиОрганизаций.Сотрудник = &Сотрудник
44 Alexandr_U1982
 
23.03.17
13:24
2. Построим таблицу с состояниями сотрудника. Например вот такую:
Период       Сотрудник     Состояние
02.06.2016   Сотрудник 1   В отпуске без сохранения оплаты
20.06.2016   Сотрудник 1   В отпуске без сохранения оплаты

Пример запроса:
ВЫБРАТЬ
   СостояниеРаботниковОрганизаций.Сотрудник,
   СостояниеРаботниковОрганизаций.Период КАК Период,
   СостояниеРаботниковОрганизаций.Состояние
ПОМЕСТИТЬ ВТСостояния
ИЗ
   РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
ГДЕ
   СостояниеРаботниковОрганизаций.Сотрудник = &Сотрудник

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   СостояниеРаботниковОрганизаций.Сотрудник,
   СостояниеРаботниковОрганизаций.ПериодЗавершения,
   ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Работает)
ИЗ
   РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
ГДЕ
   СостояниеРаботниковОрганизаций.Сотрудник = &Сотрудник
45 Alexandr_U1982
 
23.03.17
13:25
3. Построим таблицу периодов:
Период       Сотрудник
07.12.2015   Сотрудник 1
02.06.2016   Сотрудник 1
20.06.2016   Сотрудник 1
01.01.2017   Сотрудник 1
01.03.2017   Сотрудник 1

Пример запроса
ВЫБРАТЬ
   ВТКадроваяИстория.Сотрудник,
   ВТКадроваяИстория.Период
ПОМЕСТИТЬ ВТПериоды
ИЗ
   ВТКадроваяИстория КАК ВТКадроваяИстория

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ВТСостояния.Сотрудник,
   ВТСостояния.Период
ИЗ
   ВТСостояния КАК ВТСостояния
46 Alexandr_U1982
 
23.03.17
13:25
4. Для Каждого периода получим кадровые данные
Период       Сотрудник    Подразделение      Должность      Причина изменения состояния
07.12.2015   Сотрудник 1  Подразделение 1    Должность 1    Прием на работу
02.06.2016   Сотрудник 1  Подразделение 1    Должность 1    Прием на работу
20.06.2016   Сотрудник 1  Подразделение 1    Должность 1    Прием на работу
01.01.2017   Сотрудник 1  Подразделение 1    Должность 2    Перемещение
01.03.2017   Сотрудник 1  Подразделение 1    Должность 2    Увольнение

Пример запроса
ВЫБРАТЬ
  ДатыАктуальности.Сотрудник,
  ДатыАктуальности.Период,
  ВТКадроваяИстория.ПодразделениеОрганизации,
  ВТКадроваяИстория.Должность,
  ВТКадроваяИстория.ПричинаИзмененияСостояния
ПОМЕСТИТЬ ВТПериодыКадроваяИстория
ИЗ
  (ВЫБРАТЬ
      ВТПериоды.Сотрудник КАК Сотрудник,
      ВТПериоды.Период КАК Период,
      МАКСИМУМ(ВТКадроваяИстория.Период) КАК ДатаАатуальности
   ИЗ
      ВТПериоды КАК ВТПериоды
         ЛЕВОЕ СОЕДИНЕНИЕ ВТКадроваяИстория КАК ВТКадроваяИстория
         ПО ВТПериоды.Сотрудник = ВТКадроваяИстория.Сотрудник
            И ВТПериоды.Период >= ВТКадроваяИстория.Период
    
   СГРУППИРОВАТЬ ПО
      ВТПериоды.Сотрудник,
      ВТПериоды.Период) КАК ДатыАктуальности
      ЛЕВОЕ СОЕДИНЕНИЕ ВТКадроваяИстория КАК ВТКадроваяИстория
         ПО ДатыАктуальности.Сотрудник = ВТКадроваяИстория.Сотрудник
            И ДатыАктуальности.ДатаАатуальности = ВТКадроваяИстория.Период
47 Alexandr_U1982
 
23.03.17
13:25
5. Для каждого периода получим состояние сотрудника
Период       Сотрудник     Состояние
07.12.2015   Сотрудник 1
02.06.2016   Сотрудник 1   В отпуске без сохранения оплаты
20.06.2016   Сотрудник 1   В отпуске без сохранения оплаты
01.01.2017   Сотрудник 1   В отпуске без сохранения оплаты
01.03.2017   Сотрудник 1   В отпуске без сохранения оплаты

Пример запроса
ВЫБРАТЬ
   ДатыАктуальности.Сотрудник,
   ДатыАктуальности.Период КАК Период,
   ВТСостояния.Состояние
ПОМЕСТИТЬ ВТПериодыСостояния
ИЗ
   (ВЫБРАТЬ
      ВТПериоды.Сотрудник КАК Сотрудник,
      ВТПериоды.Период КАК Период,
      МАКСИМУМ(ВТСостояния.Период) КАК ДатаАтуальности
   ИЗ
      ВТПериоды КАК ВТПериоды
         ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояния КАК ВТСостояния
         ПО ВТПериоды.Сотрудник = ВТСостояния.Сотрудник
            И ВТПериоды.Период >= ВТСостояния.Период
    
      СГРУППИРОВАТЬ ПО
         ВТПериоды.Сотрудник,
         ВТПериоды.Период) КАК ДатыАктуальности
         ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояния КАК ВТСостояния
         ПО ДатыАктуальности.Сотрудник = ВТСостояния.Сотрудник
            И ДатыАктуальности.ДатаАтуальности = ВТСостояния.Период
48 Alexandr_U1982
 
23.03.17
13:26
6. Собираем кадровые данные и состояния сотрудников в разрезе периодов в одну таблицу
Период       Сотрудник    Подразделение      Должность      Причина изменения состояния   Состояние
07.12.2015   Сотрудник 1  Подразделение 1    Должность 1    Прием на работу
02.06.2016   Сотрудник 1  Подразделение 1    Должность 1    Прием на работу               В отпуске без сохранения оплаты
20.06.2016   Сотрудник 1  Подразделение 1    Должность 1    Прием на работу               В отпуске без сохранения оплаты
01.01.2017   Сотрудник 1  Подразделение 1    Должность 2    Перемещение                   В отпуске без сохранения оплаты
01.03.2017   Сотрудник 1  Подразделение 1    Должность 2    Увольнение                    В отпуске без сохранения оплаты

Пример запроса
ВЫБРАТЬ
   ВТПериодыКадроваяИстория.Сотрудник,
   ВТПериодыКадроваяИстория.Период,
   ВТПериодыКадроваяИстория.ПодразделениеОрганизации,
   ВТПериодыКадроваяИстория.Должность,
   ВТПериодыКадроваяИстория.ПричинаИзмененияСостояния,
   ВТПериодыСостояния.Состояние
ПОМЕСТИТЬ ВТКадроваяИсторияСостояния
ИЗ
   ВТПериодыКадроваяИстория КАК ВТПериодыКадроваяИстория
      ЛЕВОЕ СОЕДИНЕНИЕ ВТПериодыСостояния КАК ВТПериодыСостояния
      ПО ВТПериодыКадроваяИстория.Сотрудник = ВТПериодыСостояния.Сотрудник
         И ВТПериодыКадроваяИстория.Период = ВТПериодыСостояния.Период
49 Alexandr_U1982
 
23.03.17
13:26
7. Строим таблицу интервалов
Дата начала   Дата окончания   Сотрудник    Подразделение      Должность      Причина изменения состояния   Состояние
07.12.2015    02.06.2016       Сотрудник 1  Подразделение 1    Должность 1    Прием на работу
02.06.2016    20.06.2016       Сотрудник 1  Подразделение 1    Должность 1    Прием на работу               В отпуске без сохранения оплаты
20.06.2016    01.01.2017       Сотрудник 1  Подразделение 1    Должность 1    Прием на работу               В отпуске без сохранения оплаты
01.01.2017    01.03.2017       Сотрудник 1  Подразделение 1    Должность 2    Перемещение                   В отпуске без сохранения оплаты

Пример запроса
ВЫБРАТЬ
   ВТКадроваяИсторияСостояния_1.Период КАК ДатаНачала,
   МИНИМУМ(ВТКадроваяИсторияСостояния_2.Период) КАК ДатаОкончания,
   ВТКадроваяИсторияСостояния_1.Сотрудник,
   ВТКадроваяИсторияСостояния_1.ПодразделениеОрганизации,
   ВТКадроваяИсторияСостояния_1.Должность,
   ВТКадроваяИсторияСостояния_1.ПричинаИзмененияСостояния,
   ВТКадроваяИсторияСостояния_1.Состояние
ИЗ
   ВТКадроваяИсторияСостояния КАК ВТКадроваяИсторияСостояния_1
      ЛЕВОЕ СОЕДИНЕНИЕ ВТКадроваяИсторияСостояния КАК ВТКадроваяИсторияСостояния_2
      ПО ВТКадроваяИсторияСостояния_1.Сотрудник = ВТКадроваяИсторияСостояния_2.Сотрудник
         И ВТКадроваяИсторияСостояния_1.Период < ВТКадроваяИсторияСостояния_2.Период
ГДЕ
   НЕ ВТКадроваяИсторияСостояния_2.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
   ВТКадроваяИсторияСостояния_1.Сотрудник,
   ВТКадроваяИсторияСостояния_1.Период,
   ВТКадроваяИсторияСостояния_1.ПодразделениеОрганизации,
   ВТКадроваяИсторияСостояния_1.Должность,
   ВТКадроваяИсторияСостояния_1.ПричинаИзмененияСостояния,
   ВТКадроваяИсторияСостояния_1.Состояние

УПОРЯДОЧИТЬ ПО
  ДатаНачала
50 Alexandr_U1982
 
23.03.17
13:27
Ну а далее исключаем периоды отсутствия и соединяем с таблице с рабочими дня. Либо производственный календарь, либо регистр сведений "Графики работы по видам времени".
51 location
 
naïve
23.03.17
13:31
(43) - (50)  спс, будем разбираться
52 location
 
naïve
23.03.17
13:53
(50) + у меня не регистры организации, а просто работники и состояния работников, там нет периодов завершения.
53 Alexandr_U1982
 
23.03.17
13:57
Убирай тогда из запросов поля с завершениями, ну и регистры переименуй.
У меня тут нет ЗУП 2.1, поэтому не могу составить точные запросы.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.