В высоконагруженных системах на базе 1С:ERP Управление предприятием часто возникает специфическая проблема — так называемые «самоблокировки». Ситуация выглядит парадоксально: анализатор блокировок (например, сервис Гилева) показывает, что один и тот же пользователь конфликтует сам с собой. Один сеанс пользователя удерживает блокировку, а второй сеанс того же пользователя (часто фоновое задание) ожидает её освобождения в течение 10–20 секунд и более. Разберем подробно, почему это происходит и как оптимизировать работу системы.
Первым делом проанализируем ситуацию, описанную в сообщениях темы. Основная причина того, что пользователь «сам себя блокирует», заключается в архитектуре отложенных расчетов 1С:ERP. Когда в системе включены опции автоматической актуализации данных, любое действие пользователя (проведение документа или открытие отчета) может инициировать запуск фонового задания под той же учетной записью.
Рассмотрим механизмы, которые чаще всего становятся источниками проблем:
Проблема усугубляется, если в коде конфигурации или расширения используется неоптимальная запись данных. Рассмотрим пример кода, который часто становится «узким местом»:
ВыборкаПоДокументам = ДанныеДвижений.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоДокументам.Следующий() Цикл
НаборЗаписей = РегистрыНакопления.ДвиженияДенежныеСредстваКонтрагент.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.Регистратор);
Выборка = ВыборкаПоДокументам.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка);
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Проанализируем этот фрагмент. Использование метода НаборЗаписей.Записать() внутри цикла по регистраторам — это классическая анти-паттерн для управляемых блокировок. Каждая итерация цикла удерживает транзакцию. Если документов в выборке много, транзакция становится «длинной», и блокировка на таблицы регистра накопления ДвиженияДенежныеСредстваКонтрагент удерживается до самого конца цикла. В это же время фоновое задание пытается обновить те же записи, что и приводит к ожиданию в 13 и более секунд.
Чтобы избавить систему от лишних конфликтов, нам необходимо проверить настройки распределения расчетов. В 1С:ERP перейдем в раздел НСИ и администрирование – Настройка НСИ и разделов – Казначейство (или Продажи/Закупки в зависимости от версии).
Выясним, какие настройки влияют на появление фоновых процессов:
Офлайн, система накапливает задания в специальных технических регистрах.Проверим состояние констант в конфигураторе или через «Функции для технического специалиста»:
АктуализироватьВзаиморасчетыПриПроведенииДокументовАктуализироватьВзаиморасчетыПриФормированииОтчетовУстановим их в значение Ложь, если блокировки мешают оперативной работе пользователей.
После отключения автоматических триггеров расчет взаиморасчетов будет выполняться только регламентным заданием. Здесь тоже есть свои нюансы. Посмотрим на типовое задание Выполнение отложенных движений по расчетам с клиентами/поставщиками.
Если интервал запуска составляет 600 секунд (10 минут), за это время может накопиться огромный объем данных. Когда задание запустится, оно заблокирует таблицы на длительное время. Рассмотрим два пути оптимизации:
Часто причиной длительных блокировок становится наличие записей в регистрах сведений Задания к распределению расчетов с поставщиками и Задания к распределению расчетов с клиентами за прошлые периоды. Как было отмечено в обсуждении, там могут находиться записи за 2018 год, хотя на календаре 2019-й.
Почему это опасно? Система взаиморасчетов ERP работает по принципу FIFO в рамках объекта расчетов. Если кто-то случайно перепровел старый документ, система помечает всю цепочку после него как неактуальную. Фоновое задание начинает пересчитывать расчеты с 2018 года, блокируя актуальные документы 2019 года.
Рекомендация: Регулярно очищайте регистры заданий от «мусора» или завершайте расчеты в закрытых периодах. Обязательно установите Дату запрета редактирования — это предотвратит случайное перепроведение старых документов и запуск бесконечных цепочек пересчета.
Начиная с версии 2.4.6 (и более поздних, таких как 2.5), фирма «1С» предложила Новую архитектуру взаиморасчетов (онлайн-режим). Рассмотрим её преимущества в контексте блокировок:
РасчетыПоСрокам) в момент проведения, без использования механизма отложенных расчетов.Однако помните, что переход на новую архитектуру — это серьезный шаг, требующий пересчета данных и проверки всех доработок в части взаиморасчетов.
Для устранения самоблокировок в 1С:ERP выполним следующие шаги:
Соблюдение этих правил позволит минимизировать время ожидания на блокировках и сделает работу пользователей в 1С:ERP комфортной и стабильной.