Вход | Регистрация
 

Как ускорить выполнение запроса? (запрос большой)

Как ускорить выполнение запроса? (запрос большой)
Я
   worker-good
 
08.07.19 - 15:01
Как ускорить выполнение нижележащего запроса? Запрос большой. PS: о грехе не брать данные из документов, а только из регистров знаю, но тормоза не из-за этого.


ВЫБРАТЬ
    ахПриказОРаботеВыходныеРаботникиОрганизации.Сотрудник,
    СУММА(РАЗНОСТЬДАТ(ахПриказОРаботеВыходныеРаботникиОрганизации.ВремяНачала, ахПриказОРаботеВыходныеРаботникиОрганизации.ВремяОкончания, СЕКУНДА) / 60 / 60 - РАЗНОСТЬДАТ(ахПриказОРаботеВыходныеРаботникиОрганизации.ВремяНачалаОбеда, ахПриказОРаботеВыходныеРаботникиОрганизации.ВремяОкончанияОбеда, СЕКУНДА) / 60 / 60) КАК ТочноеКоличествоЧасовВыходных
ПОМЕСТИТЬ ПромежуточныйИтог
ИЗ
    Документ.ахПриказОРаботеВыходные.РаботникиОрганизации КАК ахПриказОРаботеВыходныеРаботникиОрганизации
ГДЕ
    ахПриказОРаботеВыходныеРаботникиОрганизации.ДатаВыхода МЕЖДУ &НачалоПериода И &КонецПериода
    И ахПриказОРаботеВыходныеРаботникиОрганизации.Ссылка.Проведен = ИСТИНА
    И ахПриказОРаботеВыходныеРаботникиОрганизации.Ссылка.ПометкаУдаления = ЛОЖЬ

СГРУППИРОВАТЬ ПО
    ахПриказОРаботеВыходныеРаботникиОрганизации.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПромежуточныйИтог.Сотрудник,
    ВЫБОР
        КОГДА (ВЫРАЗИТЬ(ПромежуточныйИтог.ТочноеКоличествоЧасовВыходных + 0.01 КАК ЧИСЛО(10, 0))) > (ВЫРАЗИТЬ(ПромежуточныйИтог.ТочноеКоличествоЧасовВыходных КАК ЧИСЛО(10, 0)))
            ТОГДА ВЫРАЗИТЬ(ПромежуточныйИтог.ТочноеКоличествоЧасовВыходных + 0.01 КАК ЧИСЛО(10, 0))
        ИНАЧЕ ВЫРАЗИТЬ(ПромежуточныйИтог.ТочноеКоличествоЧасовВыходных КАК ЧИСЛО(10, 2))
    КОНЕЦ КАК ОкругленноеЧилоЧасов
ПОМЕСТИТЬ ПромежуточныйИтогВыходных
ИЗ
    ПромежуточныйИтог КАК ПромежуточныйИтог

ИНДЕКСИРОВАТЬ ПО
    ПромежуточныйИтог.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КлассификаторИспользованияРабочегоВремени.Ссылка КАК ВидВремени
ПОМЕСТИТЬ ВТВидыВремениНеявки
ИЗ
    Справочник.КлассификаторИспользованияРабочегоВремени КАК КлассификаторИспользованияРабочегоВремени
ГДЕ
    НЕ КлассификаторИспользованияРабочегоВремени.РабочееВремя
    И КлассификаторИспользованияРабочегоВремени.Ссылка <> &ДВ
    И КлассификаторИспользованияРабочегоВремени.Ссылка <> &ВЫХОДНОЙ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря,
    РегламентированныйПроизводственныйКалендарь.ВидДня
ПОМЕСТИТЬ Праздничные
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
    И РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник)

ИНДЕКСИРОВАТЬ ПО
    ДатаКалендаря
;

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

СГРУППИРОВАТЬ ПО
    РаботникиОрганизаций.Сотрудник

ИНДЕКСИРОВАТЬ ПО
    Сотрудник,
    Период,
    ПериодЗавершения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТПериодыИзмененияДанныхКонецПериода.Сотрудник.Код КАК ТабНомер,
    ВТПериодыИзмененияДанныхКонецПериода.Сотрудник КАК Сотрудник,
    ВЫБОР
        КОГДА РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <= &КонецПериода
                И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения > РаботникиОрганизаций.Период
            ТОГДА РаботникиОрганизацийПериодЗавершения.ДолжностьЗавершения
        ИНАЧЕ РаботникиОрганизаций.Должность
    КОНЕЦ КАК Должность,
    ВЫБОР
        КОГДА РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <= &КонецПериода
                И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения > РаботникиОрганизаций.Период
            ТОГДА РаботникиОрганизацийПериодЗавершения.Сотрудник.Физлицо
        ИНАЧЕ РаботникиОрганизаций.Сотрудник.Физлицо
    КОНЕЦ КАК ФизЛицо
ПОМЕСТИТЬ ВТСотрудникиПодразделения
ИЗ
    ВТПериодыИзмененияДанныхКонецПериода КАК ВТПериодыИзмененияДанныхКонецПериода
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
        ПО ВТПериодыИзмененияДанныхКонецПериода.Сотрудник = РаботникиОрганизаций.Сотрудник
            И ВТПериодыИзмененияДанныхКонецПериода.Период = РаботникиОрганизаций.Период
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизацийПериодЗавершения
        ПО ВТПериодыИзмененияДанныхКонецПериода.Сотрудник = РаботникиОрганизацийПериодЗавершения.Сотрудник
            И ВТПериодыИзмененияДанныхКонецПериода.ПериодЗавершения = РаботникиОрганизацийПериодЗавершения.ПериодЗавершения
            И (РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1))
ГДЕ
    ВЫБОР
            КОГДА РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <= &КонецПериода
                    И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                    И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения > РаботникиОрганизаций.Период
                ТОГДА РаботникиОрганизацийПериодЗавершения.ПодразделениеОрганизацииЗавершения
            ИНАЧЕ РаботникиОрганизаций.ПодразделениеОрганизации
        КОНЕЦ В ИЕРАРХИИ (&ПодразделениеОрганизации)

ИНДЕКСИРОВАТЬ ПО
    Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СУММА(РегламентированныйПроизводственныйКалендарь.Пятидневка * ВЫБОР
            КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                ТОГДА 8
            КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
                ТОГДА 7
            ИНАЧЕ 0
        КОНЕЦ) КАК НормаПоПК,
    СУММА(РегламентированныйПроизводственныйКалендарь.Пятидневка * ВЫБОР
            КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                ТОГДА 7
            КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
                ТОГДА 6
            ИНАЧЕ 0
        КОНЕЦ) КАК НормаПоПКИнвалидность,
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ ВТНормаПоПКОбщая
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
;

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

ИНДЕКСИРОВАТЬ ПО
    РабочееВремяРаботниковОрганизаций.Период,
    РабочееВремяРаботниковОрганизаций.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ГрафикиРаботыПоВидамВремени.Дата КАК Период,
    ГрафикиРаботыПоВидамВремени.ГрафикРаботы.Ссылка КАК Сотрудник,
    СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначение) КАК ЧасовЯвки
ПОМЕСТИТЬ ВТОтработаноЧасов
ИЗ
    РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РабочееВремяРаботников КАК РабочееВремяРаботников
        ПО ГрафикиРаботыПоВидамВремени.ГрафикРаботы.Ссылка = РабочееВремяРаботников.Сотрудник
            И ГрафикиРаботыПоВидамВремени.Дата = РабочееВремяРаботников.Период
ГДЕ
    ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И ГрафикиРаботыПоВидамВремени.ГрафикРаботы.Организация = &Организация
    И ГрафикиРаботыПоВидамВремени.ГрафикРаботы.Ссылка В
            (ВЫБРАТЬ
                Т.Сотрудник
            ИЗ
                ВТСотрудникиПодразделения КАК Т)
    И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = ЗНАЧЕНИЕ(Перечисление.ВидыУчетаВремени.ПоЧасам)
    И ГрафикиРаботыПоВидамВремени.План = ЛОЖЬ

СГРУППИРОВАТЬ ПО
    ГрафикиРаботыПоВидамВремени.Дата,
    ГрафикиРаботыПоВидамВремени.ГрафикРаботы.Ссылка

ИНДЕКСИРОВАТЬ ПО
    Период,
    Сотрудник
;

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

СГРУППИРОВАТЬ ПО
    РабочееВремяРаботниковОрганизаций.Сотрудник

ИНДЕКСИРОВАТЬ ПО
    Сотрудник
;

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

СГРУППИРОВАТЬ ПО
    РабочееВремяРаботниковНеявки.Период,
    РабочееВремяРаботниковНеявки.Сотрудник,
    РабочееВремяРаботниковНеявки.Сотрудник.Физлицо

ИНДЕКСИРОВАТЬ ПО
    РабочееВремяРаботниковНеявки.Период,
    Физлицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СведенияОбИнвалидностиФизлицСрезПоследних.Физлицо,
    СведенияОбИнвалидностиФизлицСрезПоследних.Инвалидность
ПОМЕСТИТЬ ВТСведенияОбИнвлидности
ИЗ
    РегистрСведений.СведенияОбИнвалидностиФизлиц.СрезПоследних(
            &КонецПериода {(&КонецПериода)},
            Физлицо В
                (ВЫБРАТЬ
                    Т.ФизЛицо
                ИЗ
                    ВТСотрудникиПодразделения КАК Т
                СГРУППИРОВАТЬ ПО
                    Т.ФизЛицо)) КАК СведенияОбИнвалидностиФизлицСрезПоследних
ГДЕ
    СведенияОбИнвалидностиФизлицСрезПоследних.ГруппаИнвалидности = "II"

ИНДЕКСИРОВАТЬ ПО
    СведенияОбИнвалидностиФизлицСрезПоследних.Физлицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТЧасовНеявки.Период,
    ВТЧасовНеявки.Сотрудник,
    СУММА(ВЫБОР
            КОГДА ЕСТЬNULL(ВТСведенияОбИнвлидности.Инвалидность, ЛОЖЬ) = ЛОЖЬ
                ТОГДА ВТНормаПоПКОбщая.НормаПоПК
            ИНАЧЕ ВТНормаПоПКОбщая.НормаПоПКИнвалидность
        КОНЕЦ) КАК ЧасовНевки
ПОМЕСТИТЬ ВТЧасовНеявкиПоПК
ИЗ
    ВТЧасовНеявки КАК ВТЧасовНеявки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТНормаПоПКОбщая КАК ВТНормаПоПКОбщая
        ПО ВТЧасовНеявки.Период = ВТНормаПоПКОбщая.ДатаКалендаря
        ЛЕВОЕ СОЕДИНЕНИЕ ВТСведенияОбИнвлидности КАК ВТСведенияОбИнвлидности
        ПО ВТЧасовНеявки.Физлицо = ВТСведенияОбИнвлидности.Физлицо

СГРУППИРОВАТЬ ПО
    ВТЧасовНеявки.Период,
    ВТЧасовНеявки.Сотрудник

ИНДЕКСИРОВАТЬ ПО
    ВТЧасовНеявки.Период,
    ВТЧасовНеявки.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТОтработаноЧасов.Период,
    ВТОтработаноЧасов.Сотрудник,
    ВТОтработаноЧасов.ЧасовЯвки,
    8 КАК Часов
ПОМЕСТИТЬ ВТОтработаноВПраздники
ИЗ
    ВТОтработаноЧасов КАК ВТОтработаноЧасов
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Праздничные КАК Праздничные
        ПО ВТОтработаноЧасов.Период = Праздничные.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
    ВТОтработаноЧасов.Период,
    ВТОтработаноЧасов.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ВТОтработаноЧасов.Период, ВТЧасовНеявкиПоПК.Период) КАК Период,
    ЕСТЬNULL(ВТОтработаноЧасов.Сотрудник, ВТЧасовНеявкиПоПК.Сотрудник) КАК Сотрудник,
    ЕСТЬNULL(ВТОтработаноЧасов.Сотрудник.Физлицо, ВТЧасовНеявкиПоПК.Сотрудник.Физлицо) КАК ФизЛицо,
    СУММА(ЕСТЬNULL(ВТОтработаноЧасов.ЧасовЯвки, 0)) КАК ОтработаноЧасов,
    СУММА(ВТОтработаноВПраздники.Часов) КАК ОтработаноВПраздники,
    СУММА(ЕСТЬNULL(ВТОтработаноВПраздники.ЧасовЯвки, 0)) КАК ОтработаноВПраздникиПоФакту,
    СУММА(ЕСТЬNULL(ВТЧасовНеявкиПоПК.ЧасовНевки, 0)) КАК ЧасовНевки
ПОМЕСТИТЬ ВТОтработанноеВремя
ИЗ
    ВТОтработаноЧасов КАК ВТОтработаноЧасов
        ПОЛНОЕ СОЕДИНЕНИЕ ВТЧасовНеявкиПоПК КАК ВТЧасовНеявкиПоПК
        ПО ВТОтработаноЧасов.Сотрудник = ВТЧасовНеявкиПоПК.Сотрудник
            И ВТОтработаноЧасов.Период = ВТЧасовНеявкиПоПК.Период
        ЛЕВОЕ СОЕДИНЕНИЕ ВТОтработаноВПраздники КАК ВТОтработаноВПраздники
        ПО ВТОтработаноЧасов.Сотрудник = ВТОтработаноВПраздники.Сотрудник
            И ВТОтработаноЧасов.Период = ВТОтработаноВПраздники.Период

СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ВТОтработаноЧасов.Период, ВТЧасовНеявкиПоПК.Период),
    ЕСТЬNULL(ВТОтработаноЧасов.Сотрудник, ВТЧасовНеявкиПоПК.Сотрудник),
    ЕСТЬNULL(ВТОтработаноЧасов.Сотрудник.Физлицо, ВТЧасовНеявкиПоПК.Сотрудник.Физлицо)

ИНДЕКСИРОВАТЬ ПО
    Период,
    Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТОтработанноеВремя.Сотрудник,
    ВТОтработанноеВремя.ФизЛицо
ПОМЕСТИТЬ ВТСотрудникиОтработанноеВремя
ИЗ
    ВТОтработанноеВремя КАК ВТОтработанноеВремя

СГРУППИРОВАТЬ ПО
    ВТОтработанноеВремя.Сотрудник,
    ВТОтработанноеВремя.ФизЛицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТСотрудникиОтработанноеВремя.Сотрудник,
    ВТСотрудникиОтработанноеВремя.ФизЛицо КАК ФизЛицо,
    ВТНормаПоПКОбщая.ДатаКалендаря,
    ВЫБОР
        КОГДА ВТСотрудникиОтработанноеВремя.Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА ВТНормаПоПКОбщая.НормаПоПК
        КОГДА ВТНормаПоПКОбщая.ДатаКалендаря <= ВТСотрудникиОтработанноеВремя.Сотрудник.ДатаУвольнения
            ТОГДА ВТНормаПоПКОбщая.НормаПоПК
        ИНАЧЕ 0
    КОНЕЦ КАК НормаПоПК,
    ВЫБОР
        КОГДА ВТСотрудникиОтработанноеВремя.Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА ВТНормаПоПКОбщая.НормаПоПКИнвалидность
        КОГДА ВТНормаПоПКОбщая.ДатаКалендаря <= ВТСотрудникиОтработанноеВремя.Сотрудник.ДатаУвольнения
            ТОГДА ВТНормаПоПКОбщая.НормаПоПКИнвалидность
        ИНАЧЕ 0
    КОНЕЦ КАК НормаПоПКИнвалидность
ПОМЕСТИТЬ ВТСотрудникиНорма
ИЗ
    ВТСотрудникиОтработанноеВремя КАК ВТСотрудникиОтработанноеВремя,
    ВТНормаПоПКОбщая КАК ВТНормаПоПКОбщая

ИНДЕКСИРОВАТЬ ПО
    ВТНормаПоПКОбщая.ДатаКалендаря,
    ВТСотрудникиОтработанноеВремя.Сотрудник,
    ФизЛицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТСотрудникиНорма.ДатаКалендаря КАК Период,
    ВТСотрудникиНорма.Сотрудник,
    ВТСотрудникиНорма.ФизЛицо,
    ЕСТЬNULL(ВТОтработанноеВремя.ОтработаноЧасов, 0) КАК ОтработаноЧасов,
    ЕСТЬNULL(ВТОтработанноеВремя.ОтработаноВПраздники, 0) КАК ОтработаноВПраздники,
    ЕСТЬNULL(ВТОтработанноеВремя.ОтработаноВПраздникиПоФакту, 0) КАК ОтработаноВПраздникиПоФакту,
    ЕСТЬNULL(ВТСведенияОбИнвлидности.Инвалидность, ЛОЖЬ) КАК Инвалидность,
    ЕСТЬNULL(ВЫБОР
            КОГДА ЕСТЬNULL(ВТСведенияОбИнвлидности.Инвалидность, ЛОЖЬ) = ЛОЖЬ
                ТОГДА ВТСотрудникиНорма.НормаПоПК
            ИНАЧЕ ВТСотрудникиНорма.НормаПоПКИнвалидность
        КОНЕЦ, 0) КАК НормаПоПК,
    ЕСТЬNULL(ВТОтработанноеВремя.ЧасовНевки, 0) КАК ЧасовНевки
ПОМЕСТИТЬ ВТРезультат
ИЗ
    ВТСотрудникиНорма КАК ВТСотрудникиНорма
        ЛЕВОЕ СОЕДИНЕНИЕ ВТОтработанноеВремя КАК ВТОтработанноеВремя
        ПО (ВТОтработанноеВремя.Период = ВТСотрудникиНорма.ДатаКалендаря)
            И ВТСотрудникиНорма.Сотрудник = ВТОтработанноеВремя.Сотрудник
        ЛЕВОЕ СОЕДИНЕНИЕ ВТСведенияОбИнвлидности КАК ВТСведенияОбИнвлидности
        ПО ВТСотрудникиНорма.ФизЛицо = ВТСведенияОбИнвлидности.Физлицо

ИНДЕКСИРОВАТЬ ПО
    ВТСотрудникиНорма.Сотрудник,
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТРезультат.Период,
    ВТРезультат.Сотрудник,
    ВТРезультат.ОтработаноЧасов,
    ВТРезультат.ОтработаноВПраздники,
    ВТРезультат.ОтработаноВПраздникиПоФакту,
    ВТРезультат.ФизЛицо,
    ВТРезультат.Инвалидность,
    МАКСИМУМ(РаботникиОрганизаций.Период) КАК ПериодКИ,
    МАКСИМУМ(РаботникиОрганизаций.ПериодЗавершения) КАК ПериодЗавершенияКИ,
    ВТРезультат.НормаПоПК,
    ВТРезультат.ЧасовНевки
ПОМЕСТИТЬ ВТРезультатПериоды
ИЗ
    ВТРезультат КАК ВТРезультат
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
        ПО ВТРезультат.Сотрудник = РаботникиОрганизаций.Сотрудник
            И (РаботникиОрганизаций.Организация = &Организация)
            И ВТРезультат.Период >= РаботникиОрганизаций.Период

СГРУППИРОВАТЬ ПО
    ВТРезультат.Инвалидность,
    ВТРезультат.ФизЛицо,
    ВТРезультат.Сотрудник,
    ВТРезультат.Период,
    ВТРезультат.ОтработаноЧасов,
    ВТРезультат.ОтработаноВПраздники,
    ВТРезультат.ОтработаноВПраздникиПоФакту,
    ВТРезультат.НормаПоПК,
    ВТРезультат.ЧасовНевки

ИНДЕКСИРОВАТЬ ПО
    ВТРезультат.Сотрудник,
    ПериодКИ,
    ПериодЗавершенияКИ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТРезультатПериоды.Период,
    ВТРезультатПериоды.Сотрудник,
    ВТРезультатПериоды.ОтработаноЧасов,
    ВТРезультатПериоды.ОтработаноВПраздники,
    ВТРезультатПериоды.ОтработаноВПраздникиПоФакту,
    ВТРезультатПериоды.ФизЛицо,
    ВТРезультатПериоды.Инвалидность,
    ВЫБОР
        КОГДА РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <= ВТРезультатПериоды.Период
                И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И РаботникиОрганизацийПериодЗавершения.ПериодЗавершения > РаботникиОрганизаций.Период
            ТОГДА РаботникиОрганизацийПериодЗавершения.ГрафикРаботыЗавершения.СуммированныйУчетРабочегоВремени
        ИНАЧЕ РаботникиОрганизаций.ГрафикРаботы.СуммированныйУчетРабочегоВремени
    КОНЕЦ КАК СуммированныйУчетРабочегоВремени,
    ВТСотрудникиПодразделения.Должность,
    ВТСотрудникиПодразделения.ТабНомер,
    ВТРезультатПериоды.НормаПоПК,
    ВТРезультатПериоды.ЧасовНевки
ПОМЕСТИТЬ ВТРезуьтатСуммированныйУчет
ИЗ
    ВТРезультатПериоды КАК ВТРезультатПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
        ПО ВТРезультатПериоды.Сотрудник = РаботникиОрганизаций.Сотрудник
            И (РаботникиОрганизаций.Организация = &Организация)
            И ВТРезультатПериоды.ПериодКИ = РаботникиОрганизаций.Период
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизацийПериодЗавершения
        ПО ВТРезультатПериоды.Сотрудник = РаботникиОрганизацийПериодЗавершения.Сотрудник
            И (РаботникиОрганизацийПериодЗавершения.Организация = &Организация)
            И (РаботникиОрганизацийПериодЗавершения.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1))
            И ВТРезультатПериоды.ПериодЗавершенияКИ = РаботникиОрганизацийПериодЗавершения.ПериодЗавершения
        ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудникиПодразделения КАК ВТСотрудникиПодразделения
        ПО ВТРезультатПериоды.Сотрудник = ВТСотрудникиПодразделения.Сотрудник

ИНДЕКСИРОВАТЬ ПО
    ВТРезультатПериоды.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТРезуьтатСуммированныйУчет.ТабНомер,
    ВТРезуьтатСуммированныйУчет.Должность,
    ВТРезуьтатСуммированныйУчет.Сотрудник,
    СУММА(ВТРезуьтатСуммированныйУчет.ОтработаноЧасов) КАК ОтработаноЧасов,
    СУММА(ВТРезуьтатСуммированныйУчет.ОтработаноВПраздники) КАК ОтработаноВПраздники,
    СУММА(ВТРезуьтатСуммированныйУчет.ОтработаноВПраздникиПоФакту) КАК ОтработаноВПраздникиПоФакту,
    ВТРезуьтатСуммированныйУчет.Инвалидность КАК Инвалид,
    СУММА(ВТРезуьтатСуммированныйУчет.НормаПоПК) КАК НормаПоПК,
    СУММА(ВТРезуьтатСуммированныйУчет.ЧасовНевки) КАК Неявки,
    СУММА(ВТЧасовПраздники.ЧасовЯвки) КАК ЧасовЯвкиВВыходные
ПОМЕСТИТЬ ИтогОсновнойТаблицы
ИЗ
    ВТРезуьтатСуммированныйУчет КАК ВТРезуьтатСуммированныйУчет
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЧасовПраздники КАК ВТЧасовПраздники
        ПО ВТРезуьтатСуммированныйУчет.Сотрудник = ВТЧасовПраздники.Сотрудник
ГДЕ
    ВТРезуьтатСуммированныйУчет.СуммированныйУчетРабочегоВремени = ИСТИНА

СГРУППИРОВАТЬ ПО
    ВТРезуьтатСуммированныйУчет.Сотрудник,
    ВТРезуьтатСуммированныйУчет.Инвалидность,
    ВТРезуьтатСуммированныйУчет.Должность,
    ВТРезуьтатСуммированныйУчет.ТабНомер

ИНДЕКСИРОВАТЬ ПО
    ВТРезуьтатСуммированныйУчет.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИтогОсновнойТаблицы.ТабНомер,
    ИтогОсновнойТаблицы.Должность,
    ИтогОсновнойТаблицы.Сотрудник,
    ИтогОсновнойТаблицы.ОтработаноЧасов КАК ОтработаноЧасов,
    ИтогОсновнойТаблицы.ОтработаноВПраздники,
    ИтогОсновнойТаблицы.ОтработаноВПраздникиПоФакту КАК ОтработаноВПраздникиПоФакту,
    ИтогОсновнойТаблицы.Инвалид,
    ИтогОсновнойТаблицы.НормаПоПК,
    ИтогОсновнойТаблицы.Неявки,
    ПромежуточныйИтогВыходных.ОкругленноеЧилоЧасов КАК ЧасовЯвкиВВыходные
ИЗ
    ИтогОсновнойТаблицы КАК ИтогОсновнойТаблицы
        ЛЕВОЕ СОЕДИНЕНИЕ ПромежуточныйИтогВыходных КАК ПромежуточныйИтогВыходных
        ПО ИтогОсновнойТаблицы.Сотрудник = ПромежуточныйИтогВыходных.Сотрудник
 
 
   DrWatson
 
1 - 08.07.19 - 15:08
А можете сократить этот запрос до пары-тройки выборок, которые больше всего влияют на время?
Например поубирать маленькие (по количеству строк) таблицы, оставить только самые значимые.
   тарам пам пам
 
2 - 08.07.19 - 15:08
(0) >> Запрос большой
Ну так выясни, какой именно из пакета запросов тормозит, а там уже народ повангует, из-за чего конкретно оно тормозит.
   worker-good
 
3 - 08.07.19 - 15:10
(1) Так они же взаимосвязанные все, как отделить то?
   DrWatson
 
4 - 08.07.19 - 15:12
(3) Хотя бы выполнить не все сразу, сначала один, потом два и так дойти до запроса с которого начинает тормозить (если такой есть).
   worker-good
 
5 - 08.07.19 - 15:18
(4) Отделяю, но полный запрос выполняется больше 20 минут
   тарам пам пам
 
6 - 08.07.19 - 15:18
(3) Ну я лично обычно пользуюсь запросником - он умеет выводить время выполнения для каждой из врем. таблиц запроса и кол-во строк в них.
   DrWatson
 
7 - 08.07.19 - 15:19
Как вариант: убрать ИНДЕКСИРОВАТЬ ПО у всех запросов по очереди. Каждый раз смотреть как это сказывается на скорость. Есть подозрение, что индексирование далеко не всегда нужно, а операция эта не бесплатная.
   ptiz
 
8 - 08.07.19 - 15:22
(0) Я такой заготовкой в общем модуле пользуюсь, чтобы найти тормозящую часть запроса:

Функция ВыполнитьЗапросСТрассировкой(ЗапросИсх) Экспорт

    Результат = Неопределено;
    
    МВТ = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    Для каждого КлючИЗначение Из ЗапросИсх.Параметры Цикл
        Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
    КонецЦикла; 
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("ТекстЗапроса");
    ТЗ.Колонки.Добавить("Время", Новый ОписаниеТипов("Число"));
    ТЗ.Колонки.Добавить("КоличествоЗаписей", Новый ОписаниеТипов("Число"));
    
    МассивТекстов = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ЗапросИсх.Текст, ";");
    Для каждого ТекстЗапроса Из МассивТекстов Цикл
        Запрос.Текст = ТекстЗапроса;
        ДатаНач = ТекущаяДата();
        Результат = Запрос.Выполнить();
        Время = ТекущаяДата() - ДатаНач;
        Если Время > 2 Тогда
            НоваяСтрока = ТЗ.Добавить();
            НоваяСтрока.Время = Время;
            НоваяСтрока.ТекстЗапроса = ТекстЗапроса;
            Выборка = Результат.Выбрать();
            НоваяСтрока.КоличествоЗаписей = Выборка.Количество();
            Если НоваяСтрока.КоличествоЗаписей = 1 И Найти(ВРЕГ(ТекстЗапроса), "ПОМЕСТИТЬ") > 0 Тогда
                НоваяСтрока.КоличествоЗаписей = Результат.Выгрузить()[0][0];
            КонецЕсли;
        КонецЕсли;
    КонецЦикла; 
    
    ТЗ.Сортировать("Время УБЫВ");
    Для каждого СтрокаТЗ Из ТЗ Цикл
        Сообщить("Время: " + СтрокаТЗ.Время + " КоличествоЗаписей: " + СтрокаТЗ.КоличествоЗаписей + Символы.ПС + СтрокаТЗ.ТекстЗапроса + Символы.ПС);
    КонецЦикла; 
    
    МВТ.Закрыть();
    
    Возврат Результат;

КонецФункции// ВыполнитьЗапросСТрассировкой()
   worker-good
 
9 - 08.07.19 - 15:27
(6) ссылочку скиньте пожалуйста на запросник
   тарам пам пам
 
10 - 08.07.19 - 15:30
(9) http://catalog.mista.ru/public/72969/
Если погуглить, он есть где-то на сайте автора без стартмани, но ссылку я уже потерял.
Для замера он делает то же самое, что в (8) написано - т. е. повторно выполняет запрос получения каждой из врем. таблиц.
 
 Рекламное место пустует
   тарам пам пам
 
11 - 08.07.19 - 15:31
(10) мда, я слепой однако - на инфостарте в конце есть ссылка на сайт автора:
https://sites.google.com/site/vtezin/zaprosnik-1s
   Alexandr_U1982
 
12 - 08.07.19 - 15:33
Сходу:
1. Вы там несколько раз дергаете регистр накопления "РабочееВремяРаботниковОрганизаций". Как правило, в больших базах этот регистр немаленький. Также при этом используется обращение к реквизитам через две точки. Попробуйте один раз дернуть регистр и выбрать нужные записи во временную таблицу и потом использовать эту таблицу.
2. Еще у вас там есть соединение регистров "РабочееВремяРаботниковОрганизаций" и "ГрафикиРаботыПоВидамВремени". В больших базах эти регистры огромны. Бывает несколько миллионов записей. Также при использовании этого соединения у вас там есть обращение через точку к реквизиту составного типа.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует