Имя: Пароль:
1C
1С v8
Запрос для табеля
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 есть нужные данные но они не подставляются
2 + 2 = 3.9999999999999999999999999999999...