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

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

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

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

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

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

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

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


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

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

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

Наименование Файл Версия Размер
Ускоритель формирования проводок по ЗП

.1219131743 82,15Kb
236
.1219131743 82,15Kb 236 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Свой 164 19.08.08 15:05 Сейчас в теме
посмотри, не много ли еще отнимает времени создание новых СЗ и ТЗ... Собирание НДФЛ например при расчете зарплаты прилично отъедает на это
2. aves 227 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 227 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 227 21.08.08 11:42 Сейчас в теме
Еще раз проверил для ЗиК. Ошибки не вышло :-(. Для комплексной тоже работает...
Однако, спасибо за косячок. Очепятка вроде.
Копировал кусок с ТаблицаУчетаЗарплатыННП_дляРБП и не все вхождения заменил на НАЛОГОВ.
Строкой выше заменить ТаблицаУчетаЗарплатыННП_дляРБП на ТаблицаУчетаНалоговННП_дляРБП.

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

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

См. также

Дополнительные материалы к статье "1С:Предприятие 7.7. Оптимизация." Промо

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

Разгоняем 1С:Предприятие 7.7. Выжимаем последние соки.

1 стартмани

10.02.2009    21562    650    alexk-is    10    

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

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

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

18.11.2014    40838    Lapitskiy    26    

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

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

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

1 стартмани

23.05.2012    12277    66    McSeem    3    

Таблица Значений для анализа при разработке и отладке

Математика и алгоритмы v7.7 1cv7.md Россия Абонемент ($m)

Таблица Значений, для анализа данных при разработке и отладке.

1 стартмани

30.11.2011    13507    46    Boog    10    

7.7.: Решаем систему линейных уравнений

Математика и алгоритмы v77::ОУ v77::БУ v77::Расчет Россия Абонемент ($m)

Метод Гаусса

1 стартмани

05.07.2011    20703    109    Арчибальд    81    

Граф(ин) 7.7. (дополнение)

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

Строим ориентированные графы.

1 стартмани

13.11.2010    21637    19    Арчибальд    18    

Выручка от продаж. Для Бухгалтерии 7.7.

Математика и алгоритмы Розничная торговля Розничная торговля v77::БУ 1С7:Бух Россия БУ Абонемент ($m)

Анализ пришедших денег по видам оплат и покупателям.

1 стартмани

27.04.2010    12223    182    climepost    3    

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

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

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

1 стартмани

09.12.2009    12626    39    mdbm    3    

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

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

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

10 стартмани

24.11.2009    20719    1613    GSoft    31    

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

Математика и алгоритмы v77::БУ 1cv7.md Россия Абонемент ($m)

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

1 стартмани

11.06.2009    10956    12    Абушев    1    

Электронная книга "Немного теории для работы с 1С"

Математика и алгоритмы v7.7 Россия Абонемент ($m)

Полезная информация для всех, кто программирует и настраивает 1С.

17.01.2008    11014    0    adv73    25