При активной работе пользователей в программах 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация часто возникает неприятная ситуация: при попытке провести документ Приходный кассовый ордер система выдает ошибку «Конфликт блокировок при выполнении транзакции». Это означает, что текущий сеанс не смог получить доступ к нужным данным в течение установленного времени (обычно 20 секунд), так как эти данные уже «захвачены» другим процессом или пользователем.
Давайте подробно разберем, почему это происходит, где искать «виновника» и какие настройки помогут навсегда избавиться от этой проблемы.
Судя по стеку ошибки, проблема локализована в модуле менеджера регистра сведений ГрафикПлатежей, а именно в процедуре УстановитьБлокировкиДанныхДляРасчетаГрафика. Проанализируем ситуацию: когда мы проводим оплату (ПКО), система должна актуализировать информацию о том, какие счета или заказы были оплачены. Для этого она обращается к регистру ГрафикПлатежей, чтобы пересчитать плановые даты и суммы.
Конфликт возникает из-за того, что механизм 1С пытается установить управляемую блокировку. Если в этот же момент другое фоновое задание или другой пользователь проводит документ, затрагивающий тот же заказ или договор, возникает очередь. Если очередь не рассасывается за 20 секунд — транзакция прерывается с ошибкой.
Самая частая причина блокировок в современных конфигурациях на базе 1С:ERP — это включенный режим «Онлайн» для распределения расчетов. В этом режиме система пытается мгновенно обновить все цепочки взаиморасчетов при записи каждого документа. Если документов много, база данных «захлебывается» от блокировок.
Рассмотрим шаги по переключению режима:
В режиме «Оффлайн» проведение ПКО будет происходить мгновенно, а расчет графиков и зачет авансов будет выполнять фоновое задание в порядке очереди, не блокируя работу пользователей.
Иногда конфликт вызывает само регламентное задание «Выполнение отложенных движений по расчетам с клиентами». Если оно настроено на слишком частый запуск (например, каждые 5-10 секунд), оно может постоянно блокировать таблицу ГрафикПлатежей.
Проанализируем расписание:
Если типовые настройки не помогают, выясним причину в программном коде. Часто разработчики добавляют в расширения подписки на события ПередЗаписью или ПриЗаписи для регистра накопления РасчетыСКлиентами или самого документа ПриходныйКассовыйОрдер.
Разберем, на что обратить внимание при аудите кода:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ГрафикПлатежей");
ЭлементБлокировки.УстановитьЗначение("ОбъектОплаты", ОбъектОплаты);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Если блокировка устанавливается на весь регистр без указания конкретного ОбъектОплаты (измерения), это приведет к тому, что ни один пользователь не сможет проводить оплаты одновременно.
Бывают случаи, когда блокировки возникают из-за деградации производительности СУБД (SQL Server или PostgreSQL). Если индексы таблиц фрагментированы, поиск данных занимает больше времени, а значит, транзакция длится дольше.
Выполним следующие шаги:
РасчетыСКлиентами, РасчетыСКлиентамиПоДокументам и ГрафикПлатежей.ГрафикПлатежей. Если там хранятся записи десятилетней давности по закрытым договорам, их стоит перенести в архив.Как упоминалось в обсуждении на форуме, можно увеличить время ожидания блокировки в свойствах конфигурации. По умолчанию это 20 секунд.
Рассмотрим, как это сделать:
Важно: Это не решает проблему, а лишь маскирует ее. Пользователи будут дольше ждать «песочные часы» перед тем, как документ проведется или вылетит ошибка. Используйте этот метод только как временную меру, пока ищете истинную причину в коде или настройках.
Конфликт в ГрафикПлатежей при проведении ПКО — это сигнал о том, что механизмы взаиморасчетов перегружены. В 90% случаев помогает переход на оффлайн-модель расчета и оптимизация регламентных заданий. В остальных случаях требуется детальная отладка кода с использованием замера производительности, чтобы найти участок, удерживающий транзакцию слишком долго.