Проблема низкой производительности и зависания системы при заполнении и расчете документа НачислениеЗарплатыИВзносов — одна из самых частых и болезненных проблем, с которой сталкиваются расчетчики и программисты 1С в крупных базах «1С:Зарплата и управление персоналом 3» (ЗУП) и «1С:ERP Управление предприятием». Процесс расчета может занимать от нескольких часов до суток, парализуя работу расчетного отдела, особенно в периоды закрытия месяца.
В этой статье мы подробно разберем, почему возникает данная проблема, как устроен внутренний механизм платформы, приводящий к зацикливанию запросов, и рассмотрим пошаговые методы оптимизации системы — от простых пользовательских настроек до глубоких технических манипуляций на уровне СУБД и программного кода.
Давайте проанализируем стандартный сценарий работы пользователей. Расчетчик заполняет документ НачислениеЗарплатыИВзносов, проводит его для предварительного анализа. После этого в базу вводятся новые документы задним числом (например, ДанныеДляРасчетаЗарплаты для начисления цеховой премии, новые больничные листы или кадровые переводы). Чтобы учесть эти изменения, расчетчик запускает повторный расчет или пытается пересчитать документ начисления. Именно на этом этапе программа «подвисает».
Причиной такого поведения является служебный регистр сведений ПредварительныеПерерасчеты. Этот регистр предназначен для отслеживания любых изменений, которые потенциально могут повлиять на результаты расчета прошлых или текущих периодов. Когда в систему вводятся новые первичные документы после проведения основного начисления, программа автоматически делает записи в этот регистр.
При повторном заполнении или расчете документа НачислениеЗарплатыИВзносов система обращается к таблицам регистра ПредварительныеПерерасчеты, чтобы определить список сотрудников, по которым требуется выполнить доначисления. В некоторых релизах конфигураций (особенно при большом объеме данных или возникновении логических коллизий в базе) запрос платформы выполняет неоптимальное соединение таблицы этого регистра самой с собой. В результате СУБД уходит в бесконечный цикл обработки запроса, загружая процессор сервера на 100%, а для пользователя процесс выглядит как глухое зависание программы.
Часто программисты или системные администраторы пытаются обвинить пользователей в нерациональном ведении учета, утверждая, что нельзя сначала рассчитывать зарплату, а потом вводить первичные данные. Однако на практике существует масса объективных причин для подобного сценария:
Программа должна стабильно отрабатывать стандартный функционал перерасчета, независимо от последовательности ввода документов пользователями. Разберем по шагам, как решить проблему зависания.
Самый эффективный и быстрый способ разгрузить документ начисления зарплаты — это разделение основного расчета и механизмов доначисления за прошлые периоды. По умолчанию система пытается рассчитать все корректировки «на лету» прямо внутри текущего документа НачислениеЗарплатыИВзносов на специальной вкладке «Доначисления, перерасчеты».
Для оптимизации этого процесса выполним следующую настройку:
После активации этой настройки основной документ НачислениеЗарплатыИВзносов перестанет анализировать сложные связи прошлых периодов при заполнении и будет рассчитывать только текущий месяц. Сам процесс заполнения начнет происходить практически мгновенно. Все исторические перерасчеты система предложит сделать в отдельном специализированном документе ДоначислениеПерерасчет, который расчетчик сможет заполнить в удобное время.
Если зависание уже произошло, а перерасчет текущего месяца заблокирован, необходимо очистить проблемные записи. Прямое удаление данных из регистра сведений через обработку или «Функции для технического специалиста» не рекомендуется, так как можно потерять важную информацию о реальных недоплатах сотрудникам. Вместо этого воспользуемся штатным сервисом программы:
Ctrl + A).Этот шаг корректно очистит регистр сведений ПредварительныеПерерасчеты, избавив базу от избыточных связей, после чего документ начисления заполнится без зависаний.
В критических ситуациях, когда интерактивный запуск формы «Перерасчеты» также вызывает зависание из-за колоссального объема накопленных данных, программист может прибегнуть к полной или частичной очистке регистра сведений программным путем. Рассмотрим пример кода для быстрой очистки записей регистра:
НаборЗаписей = РегистрыСведений.ПредварительныеПерерасчеты.СоздатьНаборЗаписей();
// При необходимости можно установить отборы, например, по конкретному периоду или организации:
// НаборЗаписей.Отбор.ПериодРегистрации.Установить(НачалоМесяца(ТекущаяДата()));
НаборЗаписей.Записать(Истина); // Запись пустого набора очищает данные в соответствии с отбором
Применение этого кода мгновенно высвобождает ресурсы СУБД и позволяет пользователям продолжить оперативную работу по расчету зарплаты текущего месяца.
За автоматическое наполнение регистра ПредварительныеПерерасчеты в фоновом режиме отвечает регламентное задание РегистрацияПерерасчетов. В крупных информационных базах с большим количеством одновременно работающих пользователей частый запуск этого задания создает постоянную высокую нагрузку на СУБД.
Рекомендуется проанализировать расписание этого регламентного задания:
Основным источником появления «мусорных» записей в регистре перерасчетов является хаотичное перепроведение документов прошлых периодов смежными службами (например, кадровиками или табельщиками). Даже если в документе за прошлый год не изменился ни один реквизит, простое нажатие кнопки «Провести и закрыть» инициирует создание записи в регистре перерасчетов.
Для предотвращения этой проблемы установим жесткие административные рамки:
Это действие заблокирует возможность любого изменения документов исторических периодов, тем самым полностью исключив генерацию паразитного трафика записей в регистре предварительных перерасчетов.
Иногда корни проблемы лежат в плоскости СУБД. Из-за интенсивной записи и удаления данных в служебных регистрах СУБД строит неверные планы запросов (так как статистика распределения данных устаревает). Это приводит к тому, что даже простой запрос начинает выполняться неоптимально.
Для профилактики подобных зависаний системному администратору или SQL-программисту следует настроить регулярное выполнение следующих регламентных процедур на сервере баз данных:
Совместное применение этих мер гарантирует стабильную, быструю и предсказуемую работу документов расчета зарплаты даже в условиях сложного многопользовательского учета.