gifts2017

Ускоритель формирования проводок по ЗП

Опубликовал Веселов Александр (aves) в раздел Программирование - Теория программирования

Если у вас медленно формируются проводки по ЗП (ЗиК и Комплексная), то вам сюда.
Для ЗиК оптимизирована ВЫГРУЗКА (отчет и так быстрый). Примеры даны для последних конфигураций.
Изменения типовой процедуры МИНИМАЛЬНЫ.
Пишите отзывы и замеры :-)

Процедура глПроводкиЗаПериод отличается достаточно медленной работой в
новом режиме формирования АналитикуПоРБПсобиратьПоНовому=1, т.е.
формирования 97 счета по аналитике каждого сотрудника и для списание 97
закрытием месяца.

Основное время работы уходит на переписывание одних ТЗ в другие (метод
выгрузить). Причем в последствии использоваться эти ТЗ будут только
частично (несколько строк на сотрудника), а ТЗ в процессе формирования
неимоверно растут. Т.о. процесс выгрузки отъедает более 90% времени работы.

Подробнее: (если я правильно разобрался в алгоритме)
1. При работе процедуры формируются таблицы ТаблицаУчетаЗарплатыННП и
ВремТаблицаУчетаНалоговННП. Это таблицы накапливают инфу по ВСЕМ
сотрудникам, которые успели обработаться.
2. В процессе заполнения этих таблиц, если имеют место быть расходы будущих
периодов создаются доп. таблицы ТаблицаУчетаЗарплатыННП_дляРБП и
ТаблицаУчетаЗарплатыННП_дляРБП. Эти таблицы хранят ссылки на номера строк
основных таблиц, соотв РБП. Таблицы _дляРБП хранятся только по текущему
сотруднику.
3. ТаблицаУчетаЗарплатыННП и ВремТаблицаУчетаНалоговННП копируются во
временные ВремТаблицаУчетаЗарплатыННП и ВремТаблицаУчетаНалоговННП целиком.
Самый тормозной участок. 90% и более.
4. далее используется обход таблиц _дляРБП при котором из временных ТЗ
достаются данные и изменяются основные ТЗ (по одинаковым номерам строк).
Прикол в том, что используются только те строки, на которые есть ссылки в
таблицах _дляРБП.

Выход: не переписывать ненужной информации.
Далее 2 пути
Если просто переписывать во временные ТЗ только нужные строки, то надо еще
затем модифицировать использование этой ТЗ в пп4.
Предлагаемый вариант просто обманывает типовой алгоритм создавая огромные
временные ТЗ 1 раз и затем дописывает туда строки, которые затем будут
использованы. Поскольку нам нужны конкретные строки с конкретными номерами
по известному списку о остальной части временных ТЗ можно не заботиться
(пусто или мусор).
Кроме того в данном случае изменения очень компактны и подойдут для любой
редакции и легко переносимы.


В комплекте:
Функция глПроводкиЗаПериод (изм) из Комплексной 4.84 (добавлена оптимизация
и возможность формировать проводки по списку сотрудников, а не по всем -
полезно для поиска косяков) + вывод времени
Формирование проводок расчета ЗП с фильтром - стандартная обработка форм
проводок из 4.84 со списком сотрудников, берите пригодиться :-)
Измененный кусок процедуры.txt - фрагмент глПроводкиЗаПериод. Собственно
сама оптимизация. Надо просто вставить в вашу процедуру в нужное место.
Сразу найдете по комментариям. ВременнаяТЗ - определите где-нить выше.

Прошу откликнуться :-) и написать о результатах.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Ускоритель формирования проводок по ЗП
.1219131743 82,15Kb
25.09.09
81
.1219131743 82,15Kb 81 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей (Свой) 19.08.08 15:05
посмотри, не много ли еще отнимает времени создание новых СЗ и ТЗ... Собирание НДФЛ например при расчете зарплаты прилично отъедает на это
2. Веселов Александр (aves) 19.08.08 15:26
В моем исправлении новые СЗ и ТЗ не создаются. Стараюсь даже заполнять минимальное число раз.
Оптимизацией глСобратьДанныеДляНДФЛ не занимался, пока :-) т.к. временные затраты приемлемые, хотя наверное можно и меньше.

Пример реальной базы: 2500 сотрудников в базе (работают около 600) т.е. мусора много уволенного.
Расчет на спец компе в RAM диске монопольно, январь: 23 часа (в реале 2 суток), ускоренное 20 минут (в реале 1-2 часа)

Как видно перед ЭТИМ остальное не важно :-)

Можно еще кэшировать результаты глПолучитьРаспределениеРезультата. Выиграть можно 10-20% в зависимости от кол-ва начислений, базирующих на других (проверял).
3. nickVZ (nickVZ) 19.08.08 16:22
Ну, родной... "2500 сотрудников в базе (работают около 600)..."
Так не обрабатывай мусор-то ;) и не будет конфа молотить сутками впустую...
Рассмотри внимательно обработку формирования проводок... Если задать опцию "по всем", то формируется гигантский список из ВСЕГО справочника "Струдники".... Разумеется, в запросы эти "все" не попадают, но они же потом обрабатываются... Проверяются дни рождения, вытаскиваются ШП, ... Потом циклом по этому списку запросы, ТЗ... Которые, естественно, пустые. Но формируются...
Что можно сделать для ликвидации этого безобразия... Не особенно углубляясь в ГМ и т.д.:
Почистить "мусор". Т.е., если в периоде у сотрудника все ВР с Результатом = 0, ЗАЧЕМ хранить эти ВР? (внимание! ВР "Прогул", например, где заполнен реквизит "Дни" - не пустой!). Конечно, в запросах есть фильтр типа Условие(Результат<>0); но чтоб этот фильтр сработал, запись надо ПРОЧИТАТЬ.
А сколько их у тебя? А?
Удали их нафиг. И ЖЗ "похудеет". Да так похудеет, что и скуль будет ненужен. Проверено ;)
И сразу (сразу!!!) получишь прибавку к скорости, ничего более не делая! В РАЗЫ.
Ну, у меня "чистка" регулярная, при переходе на следующий период... Это хорошо, но мало: прошлые периоды почищены, а текущий? Автоматом чистить не кузяво: расчетчица точно кого-то пропустила, нодо пересчитать, а записи-то тю-тю... Вместе со строчками документов... По-новому Начало месяца вводи (или добавь и перепроведи)... Нет, автоочистки в периоде не надо...
А при начале обработки создания проводок делается гигантский список...
Нафига-2. Модифицируем обработку. Чуууутоооочку :)
Функция ПодобратьСотрудников()

СписокФизЛиц = СоздатьОбъект("СписокЗначений");

// запрос по сотрудникам, кроме внутренних совместителей, с учетом указанного
// обособленного подразделения

ТекстЗапроса =
"//{{ЗАПРОС(ПодборСотрудников)
|Период с ДатаАктуальности по ДатаАктуальности;
|Сотрудник = ЖурналРасчетов.Зарплата.Объект;
|Расчет = ЖурналРасчетов.Зарплата.ВидРасч;
|Результат = ЖурналРасчетов.Зарплата.Результат;
|Подр = ЖурналРасчетов.Зарплата.Объект.ОсновнойЭлемент.Подразделение;
|Условие(Результат<>0);
|Условие(Расчет.ВходитВГруппу(ГруппаРасчетов.ПроводкиНеФормировать)=0);"+
?(СпособВыборкиСотрудников = 2,"
|Условие(Подр в Подразделение);","") + "
|Группировка Сотрудник без групп;
|"//}}ЗАПРОС
;
Запрос = СоздатьОбъект("Запрос");
глСтатусСтрока(Контекст,"Обрабатывается журнал Зарплата");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
ВЛогФайл("Не удалось обработать справочник Сотрудники");
Возврат СписокФизЛиц
КонецЕсли;

// выгрузим запрос в таблицу, а затем в список
ВременнаяТаблица = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ВременнаяТаблица,,0);
ВременнаяТаблица.Выгрузить(СписокФизЛиц,,,"Сотрудник");

Возврат СписокФизЛиц

КонецФункции // ПодобратьСотрудников()
И гигантский список стал совсем не гигантским ;)

Проверь-ка теперь, за сколько выполнится формирование проводок? Пусть только с Нафига-2 :)
4. Веселов Александр (aves) 19.08.08 16:42
Действительно не подумал :-\.
В ЖЗ лишних у меня нема. Начисляется тока кому надо - расчетчики левым сотрам документы не вводят.
Лишних сотров действительно можно сначала выкинуть. (твоя нафиг-2 не увидит сотров просто с пересчетом ЕСН при ЖЗ=0).
И далее: останутся только не лишние.
Однако в обработке дофига еще лишних переписываний ТЗ где надо и где нет. Собственно их и оптимизирую.
Результат есть :-)
Циклы перезаписи идут по каждому сотру независимо есть РБП или нет. (Какой процент отпускников за месяц к общему списку?) Так, что убирая из получим еще выигрыш.

5. Владимир Лошко (Loshko_WR) 21.08.08 10:55
Заменил функцию глПроводкиЗаПериод, запустил...
Начало сбора данных о проводках (1123 чел) 21.08.08 10:38:17
МаксСтрок = ТаблицаУчетаНалоговННП_дляРБП.ПолучитьЗначение(ТаблицаУчетаНалоговННП_дляРБП.КоличествоСтрок(), "НомерСтрокиТаблицыУчетаНалоговННП") ;
{Глобальный модуль(43856)}: Номер за пределами значения!
...
P.S. Что такое: ВременнаяТЗ - определите где-нить выше. И нужно ли это делать если меняю полностью функцию, а не кусок оптимизации?
6. Веселов Александр (aves) 21.08.08 11:42
Еще раз проверил для ЗиК. Ошибки не вышло :-(. Для комплексной тоже работает...
Однако, спасибо за косячок. Очепятка вроде.
Копировал кусок с ТаблицаУчетаЗарплатыННП_дляРБП и не все вхождения заменил на НАЛОГОВ.
Строкой выше заменить ТаблицаУчетаЗарплатыННП_дляРБП на ТаблицаУчетаНалоговННП_дляРБП.

Если вставлять ф-ю, то ничего больше не надо. ВременнаяТЗ - ТЗ через которою копируются нужные строки из одной ТЗ в другую.
ВременнаяТЗ = СоздатьОбъект ("ТаблицаЗначений") уже есть по тексту.

Файлы заменил для всех версий
7. Алексей (Gaffer) 22.08.08 15:07
А почему во время первого цикла "Подготовка данных для формирования проводок за текущий месяц" процесс идет довольно шустро (минут пять на 2200 чел), а второй - во много раз медленнее? О.о
8. Веселов Александр (aves) 22.08.08 15:52
Какого цикла?
Поподробнее плиз...
9. Владимир Лошко (Loshko_WR) 10.09.08 16:19
Кто обновил до 7.70.484 и использует Доплату за замещение - тому может пригодится:
Строка в глобальном модуле 32673
//Loshko
//Было
ИндДня = НомерДняПериода(ДатаНачала,ЖрнЗарплата.ДатаНачала+инд);
//Добавил т.к. не считает доплату за замещение
Если (ИндДня<=0) ИЛИ (ИндДня>370) Тогда
Продолжить;
КонецЕсли;
//Loshko
10. Аркадий Кучер (Abadonna) 10.09.08 16:45
(0)>Ускоритель....
Щас так не модно. Модно называть "большой андронный коллайдер" :)))
11. VasilyKushnir (vasilykushnir) 10.09.08 16:48
(10) Шутите, шутите - а вот как шарахнет....
12. Алексей Коробов (WiseSnake) 10.09.08 17:16
Шарахнет это верно сказано. Сколько я не пытался оптимизировать формирование проводок, ничего хорошего из этого не вышло. Во первых там все работает как надо! НО можно оптимизировать если знаешь куда и как подсовывать проводки, НО это не универсальный механизм. Во вторых геморой с обновлениями. В третьих это может вылиться в ОЧЕНЬ неприятную ситуацию, когда ты окажешься крайним, а к тебе подойдут с вопросом а почему это у нас в проводках полная фигня. По этому после исследования на собственном опыте (более 6 лет) и долгих раздумий я отказался от потугов ковыряться с ускорением. Не такая уж и большая проблема. Причем если почистить справочник шаблонов проводок все работает гораздо быстрее. У меня предприятие Более 2000 РАБОТАЮЩИХ человек, с приличной текучкой и ничего страшного.
13. Алексей Лапицкий (Lapitskiy) 20.09.08 11:34
Отлично!
ЗиК 283:
Было: 5-6 часов, стало: 15 минут!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа