gifts2017

Тормоза ЗУП

Опубликовал Алексей Коробов (WiseSnake) в раздел Программирование - Практика программирования

Тормоза ЗУП

Проблемма:

Начиная, по моему  2.5.21 релиза в ЗУП были добавлены тормоза, особенно проявляются они в тех базах в котоорых много табелей.

Лекарство:

В модуле ПpoвeдeниePacчeтoвПepeoпpeдeляeмый заменить текст запроса ОтработаноНЕПоВидуВремениДляПоказателейТекст

примерно так:

    // ИЗМЕНЕНО (Алексей) начало

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

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

В базе в которой я это попроавил скорость выполнения запроса увеличилась примерно в 1000 раз. Удачи!

P.S. Кто заметит косяки просьба меня поругать!

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Антон (anton.fly7) 08.05.10 15:47
респект чувак!
я слышал, что те кто лезет в ЗУП самоубивцы и ЗП у них от статыщ
2. mastakw (mastakw) 08.05.10 21:29
3. Александр Зубцов (iov) 09.05.10 01:42
P.S. Кто заметит косяки просьба меня поругать!
ага объяснение 200 человекам почему у них зп не правильно расчитана..

А я в инете скачал.. но ничего я того чувака поругаю...
Нееее если и вылезет ошибка то она родная 1С будет а не вписана мной...
4. Игорь Исхаков (Ish_2) 09.05.10 10:58
Я так понимаю , что автор не настаивает на применении такого приёма пользователями.
А лишь делиться своим опытом в устранении тормозов.
5. Артур Аюханов (artbear) 11.05.10 09:54
Цитату "примерно так" как понимать?
что это неточный текст запроса и статью нельзя использовать?
опиши смысл изменения, за счет чего произошло столь резкое увеличение производительности?
6. Евгений (Jekka84) 11.05.10 13:13
Посещаю данный сайт именно из-за таких рекомендаций. Молодец, спасибо. Возьмем на вооружение.
7. Алексей Коробов (WiseSnake) 11.05.10 13:36
По порядку:
(1) Спасибо! Я не из Москвы у нас таких ЗП нет. А про самоубийц я согласен, особенно в начале этого года, нерв потратил много.
(2) mastakw
Суть в том что вложенный запрос вынесен в основной и сразу связывается с "ограничивающим" что дает огромный выигрыш в скорости. Предполагаю что происходит из-за того что в первую очередь собирается вложенный запрос, который внутри не ограничен условиями и чем больше регистр тем хуже.
(3) iov
ну если у Вас не возникает проблем при работе то Вам и не нужно ничего править :), но вот объяснить расчетчику почему у него больничный проводится 20 мин тоже довольно проблематично. А я как известно тоже человек и могу ошибаться и Вы кстати тоже ;)
(4) Ish_2
Конечно, чем меньше изменений тем лучше, если нет тормозов, лучше не лезть, а вот если есть милости просим.
(5) artbear
Фразу понимать так:
1. Комментарии то все равно свои стаить
2. Может отличаться в зависимости от релиза ЗУП, ведь они могут и исправить данный запрос, поэтому желательно голову при исправлении тоже использовать ;)
(6) Спасибо!
8. Евгений (Jekka84) 11.05.10 13:38
Посещаю данный сайт именно из-за таких рекомендаций. Молодец, спасибо. Возьмем на вооружение.

Только есть еще одно пожелание:
В модуле набора записей регистра накопления "РабочееВремяРаботниковОрганизаций" есть процедура "ЗарегистрироватьПерерасчеты". На мой взгляд, исполнение этой процедуры тормозит систему наиболее сильно, около 70% времени при проведении табелей отнимает именно она.

Как бы оптимизировать это дело?
9. Александр Зубцов (iov) 11.05.10 16:36
(7) то (3) Ага именно по этому и весело... Я тоже ошибался и за свои ошибки сам отвечал и по молодости чужие обработки юзал и за них меня драли... В общем по ощущениям свои как то- не так глубоко "казнили ".
А насчет доделки- ничего плохого сказать пока не могу.. просто потому что штатную ЗП Я ХЕРТРОГАТЬЬБУДУ (вспомните после новогодние обновления бухгалтерия чуть меня не порвала пришлось дать телефон франчей. а дальше быстро уползти за границы видимости бухгалтерии)
10. Алексей Коробов (WiseSnake) 11.05.10 18:16
(9) Ну у Вас как я понял 1 база ЗУП, а у меня на ЗУП 2 конторы за 2000 чел. численности + на ЗиК штук 5 из них 2 крупные, это если не считать филиалов... и все не типовые :D и это еще не моя основная работа, скажем так, так что мне с января месяца досталось по полной и восновном не из-за моих кривых рук, поеду отдыхать... задолбало все... :D
11. Александр Зубцов (iov) 11.05.10 19:30
(10) Именно по этому и весело что у меня ЗУП (пусть не одна) но главное что я её не трогаю.!!!
p.S. Это был не подкол а радость что у меня проще. И конечно надо отдыхать...
Я советую необитаемый остров... без телефона и компов..
12. desty (lustin) 12.05.10 09:11
подсвеченный diff (из комплекта git) сравнивающий изменения в запросе

хочу обратить внимание автора публикации - можно подсвечивать разницу в коде с помощью онлайн сервисов, а также можно преобразовать напрямую в html представление

будет красивше ;)
13. Алексей Коробов (WiseSnake) 12.05.10 18:44
(12) Спасибо за совет! Но если честно не вижу практического применения. Я просто выложил блок для вставки\замены в коде... А сравнить старый и новый запрос можно в разных программах... кому как удобней... если это кому то надо...
14. Алексей Черданцев (scanner1980) 13.05.10 04:55
Прирост в 2 раза при проведении табеля и отпусков. Пока полет нормальный.
15. Иван Плющев (its) 03.07.10 14:50
Автор публикации Алексей заметил и исправил опасную и вредную ошибку в ЗУП,
которая существует и в релизе ЗУП 2.5.25.3:


В некоторых ИБ, при использовании документов "Табель учета рабочего времени", в документе "Начисление зарплаты работникам организаций" количество отрботанных дней устанавливалось меньше, чем указано в табеле. Это касалось тех работников, которые работали весь месяц без неявок.

А то, что безобразно (содержал потенциальную ошибку) и неоптимально написанный первоначально запрос вызывал резкое замедление в работе при проведении документов - это уже вторично.

Рекомендую применять данное "лекарство", пока 1С не внесет изменения в типовую конфигурацию.
16. Алексей Коробов (WiseSnake) 03.07.10 17:33
(15) Спасибо за содержательный комментарий!
17. Анюта Иванова (pirog-ann) 05.07.10 14:30
its, изменение запроса не помогло. всё равно у сотрудников, отработавших весь месяц без неявок в документе "Начисление зарплаты работникам организаций" зп насчиталась на 1 отработанный день меньше.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа