Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 дек 2024, 16:45

Запрос для табеля

Автор HelpLess, 12 ноя 2023, 07:43

0 Пользователей и 1 гость просматривают эту тему.

HelpLess

Добрый день, пишу запрос для табеля в ЗУП (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

УПОРЯДОЧИТЬ ПО
    Сотрудник

LexaK

у меня такой запрос получился, попробуйте (могут быть опечатки)
ВЫБРАТЬ
    0 КАК Цифра
ПОМЕСТИТЬ Цифры

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    9
;

////////////////////////////////////////////////////////////�////////////////////
ВЫБРАТЬ
    Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра КАК Дней
ПОМЕСТИТЬ СписокДней
ИЗ
    Цифры КАК Тысячи,
    Цифры КАК Сотни,
    Цифры КАК Десятки,
    Цифры КАК Единицы
ГДЕ
    Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
;

////////////////////////////////////////////////////////////�////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, СписокДней.Дней) КАК Период
ПОМЕСТИТЬ Даты
ИЗ
    СписокДней КАК СписокДней
;     

//
Выбрать
Даты.Период,
Рег.Сотрудник,
Рег.Подразделение
из
Даты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК рег
по (Даты.Период между Рег.ДатаНачала и Рег.ДатаОкончания)                 
//если есть периоды где ДатаОкончания еще не задан
или (Даты.Период >= Рег.ДатаНачала и Рег.ДатаОкончания = ДатаВремя(1,1,1))

если помогло нажмите: Спасибо!

Похожие темы (5)

Рейтинг@Mail.ru

Поиск