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

21.08.08

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

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

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

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

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

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

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

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


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

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

См. также

Экспорт нескольких MXL таблиц в один XLS файл, на отдельные листы. Простой алгоритм

Загрузка и выгрузка в Excel Математика и алгоритмы Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).

23.11.2015    18901    etmarket    14    

20

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

Разработка внешних компонент Математика и алгоритмы Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/

12.11.2015    51085    Serginio    36    

57

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

Математика и алгоритмы Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

25.02.2015    24447    etmarket    46    

17

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

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

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

18.11.2014    43570    Lapitskiy    26    

55

Задача про сгибание листка

Математика и алгоритмы Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

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

1 стартмани

26.02.2013    19479    11    Sbelyi78    38    

9

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

Математика и алгоритмы Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Россия Абонемент ($m)

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

1 стартмани

23.05.2012    14763    66    McSeem    3    

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

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

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