Разбить периоды в запросе #793576


#0 by location
Добрый день уважаемые форумчане. Подскажите плз как можно разбить период в запросе. Т.е. есть несколько периодов работы сотрудника. Необходимо исключить из этих периодов, те периоды когда сотрудник находился в определенном состоянии. Например Сотрудник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 by СвинТуз
Так похоже на вытеснение.
#2 by mistеr
Поточнее объясни, какой результат должен быть, на твоем примере хотя бы. Нужно из первого набора периодов исключить периоды из второго набора?
#3 by location
да либо исключить, либо период работника разбить чтобы дата начала совпадала с датой начала состояния и дата конца аналогично, когда у нас затрагивает несколько периодов по сотруднику.
#4 by Alexandr_U1982
Вам нужно построить подобную таблицу 07.12.2015   02.06.2016 02.06.2016   19.06.2016 Затем для каждого интервала нужно получить состояние, и затем по состоянию сотрудников исключить некоторые периоды.
#5 by Ildarovich
Навскидку: Я бы 1) развернул периоды на дни (соединением с производственным календарем), 2) нашел те дни, когда попадает в первый, не попадает во второй и любые более сложные условия, 3) а затем соединил бы оставшиеся дни опять в непрерывные периоды ( Задача 14).
#6 by location
как построить подобную таблицу?
#7 by Alexandr_U1982
ВЫБРАТЬ РАЗЛИЧНЫЕ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыРаботников.ДатаКон ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаНачСостояния ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаКонцаСостояния     ВТПериоды_1.Физлицо, ГДЕ     НЕ ВТПериоды_2.Период ЕСТЬ NULL СГРУППИРОВАТЬ ПО     ВТПериоды_1.Физлицо,     ВТПериоды_1.Период
#8 by xxTANATORxx
не знаю всей ситуации, но я бы смотрел в сторону
#9 by location
спс большое, но у меня или мозги высушились или я уже совсем нафиг запутался, как теперь для этих интервалов получить состояния?
#10 by SeraFim
при помощи
#11 by location
там на дату, а тут на период
#12 by dezss
Я бы чуть модифицировал твой запрос вот так. Правда тут все равно не решен момент если особый период начался до начала рабочего.     ВТПериодыРаботников.ДатаНач КАК Период,     0 Как Состояние ПОМЕСТИТЬ ВТПериоды ИЗ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыРаботников.Физлицо,     ВТПериодыРаботников.ДатаКон,     0 ИЗ     ВТПериодыРаботников КАК ВТПериодыРаботников ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаНачСостояния     1 ИЗ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаКонцаСостояния     1 ИЗ ГДЕ     НЕ ВТПериоды_2.Период ЕСТЬ NULL     И (ВТПериоды_1.Состояние = 0 ИЛИ ВТПериоды_2.Состояние = 0) СГРУППИРОВАТЬ ПО     ВТПериоды_1.Физлицо,     ВТПериоды_1.Период
#13 by dezss
там некоторые зпт пропущены
#14 by Alexandr_U1982
ВЫБРАТЬ РАЗЛИЧНЫЕ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыРаботников.ДатаКон ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаНачСостояния ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаКонцаСостояния     ВТПериоды_1.Физлицо, ГДЕ     НЕ ВТПериоды_2.Период ЕСТЬ NULL СГРУППИРОВАТЬ ПО
#15 by Alexandr_U1982
#16 by Alexandr_U1982
Расскажи всю задачу. Для чего это все нужно?
#17 by dezss
Точна...надо больше параметров. Надо еще признак начала и конца периода проставить и все будет ок.
#18 by location
надо посчитать количество рабочих дней за вычетом тех дней где состояние не работает, т.е. отпуск и т.д., плюс надо еще разбить по каждой должности, т.е. необходимо посчитать количество дней по работнику на каждой должности по которой он работал за исключением дней, когда состояние у работника не равно работает.
#19 by kumena
пользуйся
#20 by location
не открывается отчет у меня этот у меня 2,1 зуп
#21 by dezss
А если вот так:     ВТПериодыРаботников.ДатаНач КАК Период,     0 Как Начало,     0 Как Состояние ПОМЕСТИТЬ ВТПериоды ИЗ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыРаботников.ДатаКон,     1,     0 ИЗ     ВТПериодыРаботников КАК ВТПериодыРаботников ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаНачСостояния,     1,     1 ИЗ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаКонцаСостояния,     0,     1 ИЗ ГДЕ     НЕ ВТПериоды_2.Период ЕСТЬ NULL     И (ВТПериоды_1.Состояние = 0 ИЛИ ВТПериоды_2.Состояние = 0)
#22 by kumena
а ну для 2.1 и не задумывалось, я её почти не застал даже. если хочешь могу доработать для твоей 2.1, но разумеется не на халяву. и делать лучше через календарь, так проще, по моему. по крайней мере у меня так сделано.
#23 by location
не правильно выбирает состояния :( для периодов
#24 by dezss
а не проверял?
#25 by location
в вообще не все периоды берет.
#26 by Alexandr_U1982
Приведи таблицу, как выбирает состояния запрос. И как должно быть правильно.
#27 by location
выбирает так Дата начала    Дата окончания   Состояние 07.12.2015     31.12.2016       NULL 01.01.2017     01.03.2017       Отпуск все больше ничего не выбирает, другие интервалы потерялись.
#28 by Alexandr_U1982
Я экспериментировал над периодами работы: 07.12.15 - 31.12.16 01.01.17 - 01.03.17 И периодами отпуска за свой счет: 02.06.16 - 19.06.16 20.06.16 - 01.03.17 Запрос из вернул таблицу: ДатаНачала    ДатаОкончания    Состояние 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 by Alexandr_U1982
Что у тебя в таблицах "ВТПериодыРаботников" и "ВТПериодыСостояний"?
#30 by location
ВТПериодыРаботников Сотрудник   ДатаНач   Датакон Сотрудник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 by location
интервалы потом выбираются такие же, а вот последний запрос выбирает всего 2 строки
#32 by Alexandr_U1982
ВТПериодыСостояний Датакон 09.09.06 Девятое сентября 2006 года!!!
#33 by location
ошибся все верно выбирает.
#34 by location
не так скопировал запрос.
#35 by Alexandr_U1982
Вот полный текст запроса, на котором экспериментирую Попробуй сравнить результаты формирования каждой временной таблицы ВЫБРАТЬ ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыРаботников.ДатаКон ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаНачСостояния ОБЪЕДИНИТЬ ВЫБРАТЬ     ВТПериодыСостояний.ДатаКонцаСостояния     ВТПериоды_1.Физлицо, ГДЕ     НЕ ВТПериоды_2.Период ЕСТЬ NULL СГРУППИРОВАТЬ ПО
#36 by Alexandr_U1982
Хорошо
#37 by location
я осознал что я нуб.
#38 by location
а чтобы назад выбрать для сотрудника его должности и подразделения, я должен таким же методом пользоваться как и для состояний?
#39 by Alexandr_U1982
Не совсем понял вопрос. Если на каждый интервал нужно получить должность и подразделение, то можно использовать тот же метод, что и для построения последней таблицы из
#40 by location
подожди, а как потом соединить это все вместе, чтобы было должность, подразделение, состояние?
#41 by location
для этого случая, правильно интервалы разбил, а для другого получилось не ок. когда работник увольнялся работал с 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 by Alexandr_U1982
В и приведено описание задачи. Отталкиваться будем от этого. Как я понял, посчитать нужно плановое количество рабочих дней. Из и непонятно, нужно определить количество рабочих дней по производственному календарю или по графику работы сотрудника? График работы может не совпадать с производственным календарем, поэтому количество рабочих дней по графику работы и по производственному календарю может получиться разным.
#43 by Alexandr_U1982
Построение запроса для получения периодов работы сотрудника. 1. Построим таблицу с кадровой историей сотрудника. Допустим таблица будет вот такая: Период       Сотрудник      Подразделение      Должность      Причина изменения состояния 07.12.2015   Сотрудник 1    Подразделение 1    Должность 1    Прием на работу 01.01.2017   Сотрудник 1    Подразделение 1    Должность 2    Перемещение 01.03.2017   Сотрудник 1    Подразделение 1    Должность 2    Увольнение Пример запроса: ВЫБРАТЬ    РаботникиОрганизаций.Сотрудник,    РаботникиОрганизаций.Период,    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ВЫБРАТЬ    РаботникиОрганизаций.ПричинаИзмененияСостоянияЗавершения ИЗ    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
#44 by Alexandr_U1982
2. Построим таблицу с состояниями сотрудника. Например вот такую: Период       Сотрудник     Состояние 02.06.2016   Сотрудник 1   В отпуске без сохранения оплаты 20.06.2016   Сотрудник 1   В отпуске без сохранения оплаты Пример запроса: ВЫБРАТЬ    СостояниеРаботниковОрганизаций.Сотрудник,    РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций ИЗ    РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций ГДЕ
#45 by Alexandr_U1982
3. Построим таблицу периодов: Период       Сотрудник 07.12.2015   Сотрудник 1 02.06.2016   Сотрудник 1 20.06.2016   Сотрудник 1 01.01.2017   Сотрудник 1 01.03.2017   Сотрудник 1 Пример запроса ВЫБРАТЬ    ВТКадроваяИстория.Сотрудник, ИЗ    ВТСостояния КАК ВТСостояния
#46 by Alexandr_U1982
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 by Alexandr_U1982
5. Для каждого периода получим состояние сотрудника Период       Сотрудник     Состояние 07.12.2015   Сотрудник 1 02.06.2016   Сотрудник 1   В отпуске без сохранения оплаты 20.06.2016   Сотрудник 1   В отпуске без сохранения оплаты 01.01.2017   Сотрудник 1   В отпуске без сохранения оплаты 01.03.2017   Сотрудник 1   В отпуске без сохранения оплаты Пример запроса ВЫБРАТЬ    ДатыАктуальности.Сотрудник,
#48 by Alexandr_U1982
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 by Alexandr_U1982
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    Перемещение                   В отпуске без сохранения оплаты ВЫБРАТЬ ИЗ ГДЕ    НЕ ВТКадроваяИсторияСостояния_2.Период ЕСТЬ NULL СГРУППИРОВАТЬ ПО
#50 by Alexandr_U1982
Ну а далее исключаем периоды отсутствия и соединяем с таблице с рабочими дня. Либо производственный календарь, либо регистр сведений "Графики работы по видам времени".
#51 by location
-   спс, будем разбираться
#52 by location
+ у меня не регистры организации, а просто работники и состояния работников, там нет периодов завершения.
#53 by Alexandr_U1982
Убирай тогда из запросов поля с завершениями, ну и регистры переименуй. У меня тут нет ЗУП 2.1, поэтому не могу составить точные запросы.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С