Имя: Пароль:
1C
1С v8
Регистр расчета
0 saksaul
 
20.08.15
12:40
Переписанная конфигурация УПП 1.2.3.1 в режиме совместимости на платформе 8.2.13.219
Клиент-сервер.
ОС сервера: Win2008
SQL 8R2
размер базы 250 ГБ
железо как мне сказали топовое, оперативы более 200 ГБ

Документ РасчсетСтраховыхВзносов внезапно стал заполняться очень долго - расчетно двое суток, но никто до конца так и не дождался (ждали более суток).

При рассмотрении причины была выявлена часть запроса отвечающего за заполнение которая тормозит процесс:
[spoiler=Первоначальный запрос]
ВЫБРАТЬ
    БазаСреднегоЗаработка.Регистратор,
    БазаСреднегоЗаработка.НомерСтроки,
    БазаСреднегоЗаработка.КодДоходаЕСНРазрез,
    БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез,
    БазаСреднегоЗаработка.РезультатБаза
ИЗ
    (ВЫБРАТЬ
        ОсновныеНачисления.Регистратор КАК Регистратор,
        ОсновныеНачисления.НомерСтроки КАК НомерСтроки,
        БазаСреднегоЗаработка.КодДоходаЕСНРазрез КАК КодДоходаЕСНРазрез,
        БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез КАК ОблагаетсяЕНВДРазрез,
        СУММА(ВЫБОР
                КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ОсновнойЗаработок)
                    ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации
                КОГДА БазаСреднегоЗаработка.ЧислоМесяцев = 0
                    ТОГДА 0
                ИНАЧЕ ВЫБОР
                        КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоФиксПремиям)
                            ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации * ВЫБОР
                                    КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0
                                        ТОГДА 0
                                    ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке
                                КОНЕЦ
                        КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоПремиям)
                            ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации
                        КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ФиксГодовыеПремии)
                            ТОГДА БазаСреднегоЗаработка.РезультатБаза * ВЫБОР
                                    КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0
                                        ТОГДА 0
                                    ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке
                                КОНЕЦ
                        ИНАЧЕ БазаСреднегоЗаработка.РезультатБаза
                    КОНЕЦ * ВЫБОР
                        КОГДА БазаСреднегоЗаработка.ЧислоМесяцев > БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка
                            ТОГДА БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка / БазаСреднегоЗаработка.ЧислоМесяцев
                        ИНАЧЕ 1
                    КОНЕЦ
            КОНЕЦ) КАК РезультатБаза
    ИЗ
        РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНОсновныеНачисления(
                    &парамИзмерения,
                    &парамИзмерения,
                    &парамРазрезыЕСН,
                    Организация = &парамГоловнаяОрганизация
                        И (ПериодРегистрации МЕЖДУ &парамПериодРегистрацииНачало И &парамПериодРегистрации)) КАК БазаСреднегоЗаработка
            ПО (БазаСреднегоЗаработка.ФизЛицо = ОсновныеНачисления.ФизЛицо)
                И (БазаСреднегоЗаработка.Организация = ОсновныеНачисления.Организация)
                И (ВЫБОР
                    КОГДА БазаСреднегоЗаработка.Приказ = &ПустойПриказ
                        ТОГДА БазаСреднегоЗаработка.Приказ
                    КОГДА БазаСреднегоЗаработка.СпособРасчета = &СпособРасчетаПоСреднемуЗаработкуФСС
                        ТОГДА ЕСТЬNULL(БазаСреднегоЗаработка.Регистратор.Приказ, БазаСреднегоЗаработка.Приказ)
                    ИНАЧЕ БазаСреднегоЗаработка.Приказ
                КОНЕЦ = ОсновныеНачисления.Приказ)
                И ОсновныеНачисления.ВидРасчета.СпособРасчета = БазаСреднегоЗаработка.СпособРасчета
                И ОсновныеНачисления.ДатаНачалаСобытия = БазаСреднегоЗаработка.ДатаНачалаСобытия
                И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаНачало = БазаСреднегоЗаработка.ДатаНачалаРасчетногоПериода
                И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаОкончание = БазаСреднегоЗаработка.ДатаОкончанияРасчетногоПериода
    ГДЕ
        ОсновныеНачисления.ОбособленноеПодразделение = &парамОрганизация
        И ОсновныеНачисления.ПериодРегистрации = &парамПериодРегистрации
        И ОсновныеНачисления.ВидРасчета.СпособРасчета В(&парамМассивСпособРасчетаПоСреднему)
    
    СГРУППИРОВАТЬ ПО
        ОсновныеНачисления.Регистратор,
        ОсновныеНачисления.НомерСтроки,
        БазаСреднегоЗаработка.КодДоходаЕСНРазрез,
        БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ОсновныеНачисления.Регистратор,
        ОсновныеНачисления.НомерСтроки,
        БазаСреднегоЗаработка.КодДоходаЕСНРазрез,
        БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез,
        СУММА(ВЫБОР
                КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ОсновнойЗаработок)
                    ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации
                КОГДА БазаСреднегоЗаработка.ЧислоМесяцев = 0
                    ТОГДА 0
                ИНАЧЕ ВЫБОР
                        КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоФиксПремиям)
                            ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации * ВЫБОР
                                    КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0
                                        ТОГДА 0
                                    ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке
                                КОНЕЦ
                        КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоПремиям)
                            ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации
                        КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ФиксГодовыеПремии)
                            ТОГДА БазаСреднегоЗаработка.РезультатБаза * ВЫБОР
                                    КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0
                                        ТОГДА 0
                                    ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке
                                КОНЕЦ
                        ИНАЧЕ БазаСреднегоЗаработка.РезультатБаза
                    КОНЕЦ * ВЫБОР
                        КОГДА БазаСреднегоЗаработка.ЧислоМесяцев > БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка
                            ТОГДА БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка / БазаСреднегоЗаработка.ЧислоМесяцев
                        ИНАЧЕ 1
                    КОНЕЦ
            КОНЕЦ)
    ИЗ
        РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНДополнительныеНачисления(
                    &парамИзмерения,
                    &парамИзмерения,
                    &парамРазрезыЕСН,
                    Организация = &парамГоловнаяОрганизация
                        И (ПериодРегистрации МЕЖДУ &парамПериодРегистрацииНачало И &парамПериодРегистрации)) КАК БазаСреднегоЗаработка
            ПО (БазаСреднегоЗаработка.ФизЛицо = ОсновныеНачисления.ФизЛицо)
                И (БазаСреднегоЗаработка.Организация = ОсновныеНачисления.Организация)
                И (ВЫБОР
                    КОГДА БазаСреднегоЗаработка.Приказ = &ПустойПриказ
                        ТОГДА БазаСреднегоЗаработка.Приказ
                    КОГДА БазаСреднегоЗаработка.СпособРасчета = &СпособРасчетаПоСреднемуЗаработкуФСС
                        ТОГДА ЕСТЬNULL(БазаСреднегоЗаработка.Регистратор.Приказ, БазаСреднегоЗаработка.Приказ)
                    ИНАЧЕ БазаСреднегоЗаработка.Приказ
                КОНЕЦ = ОсновныеНачисления.Приказ)
                И (БазаСреднегоЗаработка.СпособРасчета = ОсновныеНачисления.ВидРасчета.СпособРасчета)
                И ОсновныеНачисления.ДатаНачалаСобытия = БазаСреднегоЗаработка.ДатаНачалаСобытия
                И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаНачало = БазаСреднегоЗаработка.ДатаНачалаРасчетногоПериода
                И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаОкончание = БазаСреднегоЗаработка.ДатаОкончанияРасчетногоПериода
    ГДЕ
        ОсновныеНачисления.ОбособленноеПодразделение = &парамОрганизация
        И ОсновныеНачисления.ПериодРегистрации = &парамПериодРегистрации
        И ОсновныеНачисления.ВидРасчета.СпособРасчета В(&парамМассивСпособРасчетаПоСреднему)
    
    СГРУППИРОВАТЬ ПО
        ОсновныеНачисления.Регистратор,
        ОсновныеНачисления.НомерСтроки,
        БазаСреднегоЗаработка.КодДоходаЕСНРазрез,
        БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез) КАК БазаСреднегоЗаработка
[/spoiler]

За периоды с января - май данные выбираются в течении одной минуты (секунд 30), с июня - июль заполняются ооооочень долго. Проблема в первой части запроса - выборка из РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНОсновныеНачисления

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

ИНДЕКСИРОВАТЬ ПО
    ФизЛицо,
    Организация,
    Приказ,
    СпособРасчета
;

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

Запрос стал выполнятся всего 40 минут.

Что же такое могло произойти с регистром в периоде с июня месяца? С регистрами расчета дела не имел, поэтому пока не очень понимаю куда копать...
1 saksaul
 
20.08.15
12:43
прошу прощения за оформление, но никаких кнопок редактирования поста не вижу в браузере, вполне возможно дело в ограничениях наложенных СБ предприятия.
2 Господин ПЖ
 
20.08.15
12:45
телепатов нет - смотрите сами чего в базе не так
3 saksaul
 
20.08.15
12:48
Да я и не надеюсь что мне расскажу что конкретно произошло, мне интересно  были ли подобные случаи у кого-то еще и какие проблемы чаще всего встречаются в регистрами расчетов. Может быть сразу на что-то внимание обратить надо.
4 leonidkorolev
 
20.08.15
12:49
(0) Глубже надо копать. В скуль лезть. Посмотреть какие таблицы отвечают за этот регистр, какие запросы генерит платформа, смотреть планы запросов.
5 GROOVY
 
20.08.15
12:50
Хоть бы отбор по документу сделали...
Да и ПериодРегистрации МЕЖДУ быть не может. Это точка.
И вообще ужасный запрос.
6 saksaul
 
20.08.15
13:00
(5) Почему период ПериодРегистрации МЕЖДУ быть не может?
отбор по документу зачем если данные в общем-то за половину года при вычислении выбираются и рубятся только начиная с 6-го месяца.
7 GROOVY
 
20.08.15
13:05
(6) А почему нужно данные выбирать из реальной таблицы? Вы все документы каждый месяц пересчитываете? Или все же расчет производится одного документа?
8 saksaul
 
20.08.15
13:06
(7) Одного документ только.
9 GROOVY
 
20.08.15
13:42
(8) А нафига тогда все выбираете?

И обращение через точку к полям составного типа (ВТ_БазаЕСНОсн.Регистратор.Приказ) - это жесть, типизируйте поле.
10 saksaul
 
20.08.15
13:55
(9) Этим вопросом уже задались, надо изучать работу документа.
Типизацией уже тоже занялись. Это был просто проверочный вариант максимально близкий к "оригинальному" запросу.
11 saksaul
 
20.08.15
14:30
(9) что интересно выборка на период по которому делает расчет документ вообще пустая  - нет ни одной строки.. типа
12 saksaul
 
01.09.15
09:26
Проблема оказалась в документе начисления который был помечен на удаление но при этом его движения остались в регистре.