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

Публикация № 16250

Разработка - Математика и алгоритмы

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

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

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

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

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


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

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

13

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

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

Специальные предложения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Степень сходства двух наименований справочника 13

Статья Программист Внешний отчет (ert,erf) v7.7 v8 Windows Абонемент ($m) Математика и алгоритмы

Статья посвящена исследованию следующего вопроса: необходимо сравнить 2 наименования справочников с целью вычисления их степени сходства. По задумке, степень сходства должна выражаться в процентах.

1 стартмани

25.02.2015    17495    etmarket    34       

Записки на память. Зарплата и кадры 1С 7.7 (ЗиК 7.7 ) 54

Статья Системный администратор Программист Бухгалтер Нет файла v77::Расчет 1С7:ЗиК Россия БУ НУ УУ Windows Зарплата Управление персоналом (HRM) Бесплатно (free) Бухгалтерский учет

ЗиК 7.7 постепенно сходит на нет. Но, возможно, кому-то из нас все-таки когда-либо еще не раз придется столкнуться с этой конфигурацией. Поскольку работы по ней и заказов всё меньше и меньше, знания о ней и опыт постепенно угасают. Мой опыт с ЗиК 7.7 длиной в 14 лет терять просто так неохота. В этой статье я запишу, чтобы не забыть, важные моменты об этой конфигурации, чтобы самому не забыть, и вдруг кто-то получит это в наследство на сопровождение и будет вынужден (иначе не скажешь) это обслуживать. Или еще можно рассматривать эту статью как модное нынче «Письмо самому себе в прошлое».

18.11.2014    35241    Lapitskiy    26       

Универсальная печать таблицы значений 8

Инструменты и обработки Системный администратор Программист Бухгалтер Внешняя обработка (ert,epf) v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Абонемент ($m) Математика и алгоритмы

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

1 стартмани

23.05.2012    10201    66    McSeem    3       

Временные константы 2

Инструменты и обработки Программист Конфигурация (md, cf) v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Абонемент ($m) Математика и алгоритмы

Создаем альтернативу штатным константам 1С 7.7 Необходимо: 1. Добавить один справочник. 2. Добавить одно перечисление 3. Добавить одну функцию в глобальный модуль.

1 стартмани

09.12.2009    10564    39    mdbm    3       

Обучение: Методическое пособие "Оперативный учет" 105

Инструменты и обработки Программист Архив с данными v77::ОУ 1cv7.md Россия Абонемент ($m) Математика и алгоритмы Практика программирования

Методическое пособие по компоненте "Оперативный учет" и примеры конфигураций по методическому пособию

10 стартмани

24.11.2009    17531    1615    GSoft    31       

Реестр полученных отчетов (Для Свода Отчетов ред. 2) 2

Инструменты и обработки Программист Бухгалтер Внешний отчет (ert,erf) v77::БУ 1cv7.md Россия Абонемент ($m) Математика и алгоритмы

Отчет предназначен для конфигурации Свод отчетов ред. 2, для формирования отчета по учреждениям и формам которые они должны сдать.

1 стартмани

11.06.2009    9037    12    Абушев    1