![]() |
|
Запрос для табеля | ☑ | ||
---|---|---|---|---|
0
HelpLess
12.11.23
✎
09:17
|
Добрый день, пишу запрос для табеля в ЗУП (3.1.24.212), но результат не тот что нужно. Должны выводиться для каждого сотрудника в табеле по заданному периоду подразделения в которых они находились на данный день. Сейчас некоторые даты заполняются NULL и ни как не могу это исправить, подскажите пожалуйста как можно исправить данную проблему
Если есть предложения по оптимизации запроса, буду рад выслушать. Суть в том, чтобы объединить в одну таблицу прием на работу, перевод в другое подразделение и начальные данные (из регистра кадровая история сотрудников). У меня получаются эти данные, но не объединяются, там где должны быть данные из последней таблицы там NULL, как избавится от NULL чтобы туда попали нужные данные? Сам запрос:ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ Цифры ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра КАК Дней ПОМЕСТИТЬ СписокДней ИЗ Цифры КАК Тысячи, Цифры КАК Сотни, Цифры КАК Десятки, Цифры КАК Единицы ГДЕ Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, СписокДней.Дней) КАК Период ПОМЕСТИТЬ Даты ИЗ СписокДней КАК СписокДней ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ТабельУчетаРабочегоВремениДанныеОВремени.Сотрудник КАК Сотрудник, КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания КАК ДатаОкончания, КадроваяИсторияСотрудниковИнтервальный.ДатаНачала КАК ДатаНачала, КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение, ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.Подразделение КАК ПодразделениеТабеля, КадроваяИсторияСотрудниковИнтервальный.ВидСобытия КАК ВидСобытия ПОМЕСТИТЬ ВТ_Прием ИЗ Документ.ТабельУчетаРабочегоВремени.ДанныеОВремени КАК ТабельУчетаРабочегоВремениДанныеОВремени ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный ПО ТабельУчетаРабочегоВремениДанныеОВремени.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник И ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.Подразделение = КадроваяИсторияСотрудниковИнтервальный.Подразделение И (КадроваяИсторияСотрудниковИнтервальный.ДатаНачала МЕЖДУ ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.ДатаНачалаПериода И ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.ДатаОкончанияПериода) ГДЕ ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка = &Ссылка И КадроваяИсторияСотрудниковИнтервальный.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Прием) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабельУчетаРабочегоВремениДанныеОВремени.Сотрудник КАК Сотрудник, КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение, КадроваяИсторияСотрудниковИнтервальный.ДатаНачала КАК ДатаНачала, КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания КАК ДатаОкончания, ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.Подразделение КАК ПодразделениеТабеля, КадроваяИсторияСотрудниковИнтервальный.ВидСобытия КАК ВидСобытия ПОМЕСТИТЬ Вт_Перевод ИЗ Документ.ТабельУчетаРабочегоВремени.ДанныеОВремени КАК ТабельУчетаРабочегоВремениДанныеОВремени ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный ПО ТабельУчетаРабочегоВремениДанныеОВремени.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник И (КадроваяИсторияСотрудниковИнтервальный.ДатаНачала МЕЖДУ ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.ДатаНачалаПериода И ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.ДатаОкончанияПериода ИЛИ КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания МЕЖДУ ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.ДатаНачалаПериода И ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка.ДатаОкончанияПериода) ГДЕ ТабельУчетаРабочегоВремениДанныеОВремени.Ссылка = &Ссылка И КадроваяИсторияСотрудниковИнтервальный.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Перемещение) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания КАК ДатаОкончания, КадроваяИсторияСотрудниковИнтервальный.ДатаНачала КАК ДатаНачала, КадроваяИсторияСотрудниковИнтервальный.Подразделение КАК Подразделение, ВложенныйЗапрос.Сотрудник КАК Сотрудник, ВложенныйЗапрос.ПодразделениеТабеля КАК ПодразделениеТабеля, КадроваяИсторияСотрудниковИнтервальный.ВидСобытия КАК ВидСобытия ПОМЕСТИТЬ ВТ_НачальныеДанные ИЗ (ВЫБРАТЬ ВТ_Прием.Сотрудник КАК Сотрудник, ВТ_Прием.ПодразделениеТабеля КАК ПодразделениеТабеля ИЗ ВТ_Прием КАК ВТ_Прием ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Вт_Перевод.Сотрудник, Вт_Перевод.ПодразделениеТабеля ИЗ Вт_Перевод КАК Вт_Перевод) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный ПО ВложенныйЗапрос.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник ГДЕ КадроваяИсторияСотрудниковИнтервальный.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.НачальныеДанные) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Даты.Период КАК Период, Вт_Перевод.Сотрудник КАК Сотрудник, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(Вт_Перевод.ДатаНачала, ДЕНЬ) <= Даты.Период И Даты.Период < НАЧАЛОПЕРИОДА(Вт_Перевод.ДатаОкончания, ДЕНЬ) ТОГДА Вт_Перевод.Подразделение КОНЕЦ КАК Подразделение, Вт_Перевод.ПодразделениеТабеля КАК ПодразделениеТабеля, Вт_Перевод.ВидСобытия КАК ВидСобытия ПОМЕСТИТЬ Итог ИЗ Даты КАК Даты, Вт_Перевод КАК Вт_Перевод ГДЕ НЕ Вт_Перевод.Подразделение ЕСТЬ NULL ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Даты.Период, ВТ_Прием.Сотрудник, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(ВТ_Прием.ДатаНачала, ДЕНЬ) <= Даты.Период И Даты.Период < НАЧАЛОПЕРИОДА(ВТ_Прием.ДатаОкончания, ДЕНЬ) ТОГДА ВТ_Прием.Подразделение КОНЕЦ, ВТ_Прием.ПодразделениеТабеля, ВТ_Прием.ВидСобытия ИЗ Даты КАК Даты, ВТ_Прием КАК ВТ_Прием ГДЕ НЕ ВТ_Прием.Подразделение ЕСТЬ NULL ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Даты.Период, ВТ_НачальныеДанные.Сотрудник, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(ВТ_НачальныеДанные.ДатаНачала, ДЕНЬ) <= Даты.Период И Даты.Период < НАЧАЛОПЕРИОДА(ВТ_НачальныеДанные.ДатаОкончания, ДЕНЬ) ТОГДА ВТ_НачальныеДанные.Подразделение КОНЕЦ, ВТ_НачальныеДанные.ПодразделениеТабеля, ВТ_НачальныеДанные.ВидСобытия ИЗ Даты КАК Даты, ВТ_НачальныеДанные КАК ВТ_НачальныеДанные ГДЕ НЕ ВТ_НачальныеДанные.Подразделение ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Итог.Период КАК Период, Итог.Сотрудник КАК Сотрудник, Итог.Подразделение КАК ПодразделениеСотрудника, ВЫБОР КОГДА Итог.Подразделение.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) ТОГДА Итог.Подразделение ИНАЧЕ Итог.Подразделение.Родитель КОНЕЦ КАК ГлПодразделениеСотрудника, Итог.ПодразделениеТабеля КАК ПодразделениеТабеля, ВЫБОР КОГДА Итог.ПодразделениеТабеля.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) ТОГДА Итог.ПодразделениеТабеля ИНАЧЕ Итог.ПодразделениеТабеля.Родитель КОНЕЦ КАК ГлПодразделениеТабеля, Итог.ВидСобытия КАК ВидСобытия ИЗ Итог КАК Итог ГДЕ НЕ Итог.Подразделение ЕСТЬ NULL УПОРЯДОЧИТЬ ПО Сотрудник |
|||
1
Гена
12.11.23
✎
09:34
|
Во намудрили )
ЗУП уже любезно собрал в регистре КадроваяИсторияСотрудниковИнтервальный всю историю сотрудника по интервалам его нахождения в разных подразделениях. Гляньте. Сотрудник Дата_1 ... Дата_2 ... Подразделение_1 Дата_2 + 1 ... Дата_3 ... Подразделение_2 ... Дата_N + 1 ... 31.12.3999 ... Подразделение_N Осталось только запросить кодом в несколько строк по заданному временному интервалу. |
|||
2
HelpLess
12.11.23
✎
10:01
|
Я понимаю, но мне нужна таблица где будет сотрудника и его подразделение на каждый день за определенный период
|
|||
3
Гена
12.11.23
✎
10:17
|
(2) А это сложно? Имея ВТ из (1).
|
|||
4
HelpLess
12.11.23
✎
10:52
|
(3) Должно получиться примерно так - https://ibb.co/P5Y9rjM
|
|||
5
HelpLess
12.11.23
✎
10:53
|
(3) а в (1) просто интервалами
|
|||
6
SleepyHead
12.11.23
✎
11:33
|
(2) Тут либо хитрый запрос, либо постобработка.
пример такого запроса: https://infostart.ru/1c/tools/147834/ И кстати, запросы бывают не только в 1с. Еще к поисковым машинам в интернете - пишешь им человеческим языком, что хочешь получить, и смотришь результаты. |
|||
7
SleepyHead
12.11.23
✎
11:41
|
Вангую, что на самом деле автору надо объединять две или более таблиц.
К примеру, в первой таблице история изменения подразделения. Во второй таблице история изменения чего-то еще, что хранится в другом регистре. Например, в первой таблице подразделения, а в другой вид занятости, или график работы. Надо выделить интервалы дат, в которых подразделение и график не меняются. Методика "в лоб", к которой (наверное) хочет прибегнуть автор - простая, но крайне неэффективная. Это станет заметно на базе уже от 50 сотрудников (сам делал такую фигню и поэтому знаю). Мне в аналогичной ситуации пришлось писать свою библиотеку объединения таких таблиц. |
|||
8
_Batoo
12.11.23
✎
12:23
|
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников
|
|||
9
HelpLess
12.11.23
✎
13:02
|
(7) У меня собственно есть 3 ВТ где все нужные мне данные, их нужно только объединить, но не получается тк в 1 и 2 ВТ NULL, а 3 есть нужные данные но они не подставляются
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |