Как избежать блокировок при одновременном проведении документов начисления зарплаты в ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При работе в 1С:Зарплата и Управление Персоналом 3.1 многие организации сталкиваются с проблемой взаимных блокировок при попытке нескольких расчетчиков одновременно проводить документы Начисление зарплаты и взносов. Давайте разберем, почему это происходит и какие шаги помогут нам минимизировать простои системы.

Понимание причин возникновения блокировок

Основная техническая причина кроется в механизме работы СУБД (чаще всего Microsoft SQL Server). Когда транзакция захватывает большое количество записей в регистрах расчета или накопления, сервер баз данных активирует механизм эскалации блокировок. Если количество строк, участвующих в транзакции, превышает критический порог (обычно около 5000 строк), блокировка переходит с уровня записи на уровень всей таблицы. В результате другие пользователи не могут записывать данные в эти же таблицы, что приводит к «зависанию» сеансов.

Организационные методы решения проблемы

Прежде чем приступать к глубоким доработкам, рассмотрим методы оптимизации процесса:

  1. Ограничение объема данных: Рекомендуется не включать в один документ более 1000 сотрудников. Слишком массивные документы повышают вероятность эскалации блокировок.
  2. Правило «переходящих» сотрудников: Расчетчиков, которые меняли подразделения внутри расчетного периода, лучше выделять в отдельные документы. Это позволяет разграничить области данных, с которыми работают разные пользователи.
  3. Жесткий регламент: Внедрите график работ. Например, в 09:00 — расчет больничных, в 10:00 — отпусков, в 14:00 — начисление основной зарплаты. Это исключит ситуацию, когда один пользователь рассчитывает отпуск сотрудника, а второй в это же время проводит документ начисления зарплаты по этому же лицу.

Технические подходы к оптимизации

Если организационные меры не дают нужного эффекта, перейдем к техническим решениям:

Использование фоновых заданий для заполнения

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

  1. Пользователь создает документ, но не заполняет его сразу.
  2. Система записывает ссылку на документ и ID пользователя в специальный РегистрСведений.
  3. Фоновое задание (регламентное) считывает данные из этого регистра и выполняет заполнение и проведение документа в фоновом режиме.
  4. Для оповещения пользователя о завершении процесса можно использовать механизм ОповещенияПользователей, входящий в БСП.

Рассмотрим логику работы фонового задания, которое мониторит очередь задач:


// Пример упрощенной логики фонового задания
Выборка = РегистрыСведений.ОчередьЗаполненияДокументов.Выбрать();
Пока Выборка.Следующий() Цикл
    ДокументОбъект = Выборка.СсылкаНаДокумент.ПолучитьОбъект();
    ДокументОбъект.Заполнить();
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    // После успешного проведения удаляем запись из очереди
    НаборЗаписей = РегистрыСведений.ОчередьЗаполненияДокументов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.СсылкаНаДокумент.Установить(Выборка.СсылкаНаДокумент);
    НаборЗаписей.Записать();
КонецЦикла;

Анализ состояния системы

Для выявления конкретных узких мест проанализируйте поведение вашей базы:

Применяя эти рекомендации комплексно, вы сможете значительно снизить уровень конфликтности при проведении документов и обеспечить стабильную работу расчетчиков даже в периоды высокой нагрузки.

← На главную