Как решить ошибку «Превышено максимальное время ожидания предоставления блокировки» при проведении ПКО

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

При активной работе пользователей в программах 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация часто возникает неприятная ситуация: при попытке провести документ Приходный кассовый ордер система выдает ошибку «Конфликт блокировок при выполнении транзакции». Это означает, что текущий сеанс не смог получить доступ к нужным данным в течение установленного времени (обычно 20 секунд), так как эти данные уже «захвачены» другим процессом или пользователем.

Давайте подробно разберем, почему это происходит, где искать «виновника» и какие настройки помогут навсегда избавиться от этой проблемы.

Анализируем причину возникновения ошибки

Судя по стеку ошибки, проблема локализована в модуле менеджера регистра сведений ГрафикПлатежей, а именно в процедуре УстановитьБлокировкиДанныхДляРасчетаГрафика. Проанализируем ситуацию: когда мы проводим оплату (ПКО), система должна актуализировать информацию о том, какие счета или заказы были оплачены. Для этого она обращается к регистру ГрафикПлатежей, чтобы пересчитать плановые даты и суммы.

Конфликт возникает из-за того, что механизм 1С пытается установить управляемую блокировку. Если в этот же момент другое фоновое задание или другой пользователь проводит документ, затрагивающий тот же заказ или договор, возникает очередь. Если очередь не рассасывается за 20 секунд — транзакция прерывается с ошибкой.

Решение 1: Изменение режима распределения расчетов

Самая частая причина блокировок в современных конфигурациях на базе 1С:ERP — это включенный режим «Онлайн» для распределения расчетов. В этом режиме система пытается мгновенно обновить все цепочки взаиморасчетов при записи каждого документа. Если документов много, база данных «захлебывается» от блокировок.

Рассмотрим шаги по переключению режима:

  1. Перейдем в раздел НСИ и администрирование.
  2. Выберем пункт Казначейство (или Продажи/Закупки, в зависимости от версии).
  3. Найдем настройку Распределение расчетов.
  4. Установим значение Оффлайн (регламентным заданием).

В режиме «Оффлайн» проведение ПКО будет происходить мгновенно, а расчет графиков и зачет авансов будет выполнять фоновое задание в порядке очереди, не блокируя работу пользователей.

Решение 2: Оптимизация регламентных заданий

Иногда конфликт вызывает само регламентное задание «Выполнение отложенных движений по расчетам с клиентами». Если оно настроено на слишком частый запуск (например, каждые 5-10 секунд), оно может постоянно блокировать таблицу ГрафикПлатежей.

Проанализируем расписание:

  1. Откроем Обслуживание — Регламентные операции — Регламентные и фоновые задания.
  2. Найдем указанное задание.
  3. Посмотрим на его длительность. Если задание выполняется 15 секунд, а запускается каждые 10 — оно будет блокировать само себя и пользователей.
  4. Увеличим интервал запуска до разумных пределов (например, раз в 5 минут или только в периоды низкой активности).

Решение 3: Аудит доработок и подписок на события

Если типовые настройки не помогают, выясним причину в программном коде. Часто разработчики добавляют в расширения подписки на события ПередЗаписью или ПриЗаписи для регистра накопления РасчетыСКлиентами или самого документа ПриходныйКассовыйОрдер.

Разберем, на что обратить внимание при аудите кода:


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ГрафикПлатежей");
ЭлементБлокировки.УстановитьЗначение("ОбъектОплаты", ОбъектОплаты);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

Если блокировка устанавливается на весь регистр без указания конкретного ОбъектОплаты (измерения), это приведет к тому, что ни один пользователь не сможет проводить оплаты одновременно.

Решение 4: Техническое обслуживание базы данных

Бывают случаи, когда блокировки возникают из-за деградации производительности СУБД (SQL Server или PostgreSQL). Если индексы таблиц фрагментированы, поиск данных занимает больше времени, а значит, транзакция длится дольше.

Выполним следующие шаги:

  1. Обновим статистику базы данных.
  2. Выполним реиндексацию таблиц, относящихся к регистрам РасчетыСКлиентами, РасчетыСКлиентамиПоДокументам и ГрафикПлатежей.
  3. Проверим объем данных в регистре ГрафикПлатежей. Если там хранятся записи десятилетней давности по закрытым договорам, их стоит перенести в архив.

Решение 5: Увеличение времени ожидания (крайняя мера)

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

Рассмотрим, как это сделать:

  1. В конфигураторе откроем свойства корневого узла конфигурации.
  2. Найдем параметр Время ожидания блокировки данных.
  3. Увеличим значение (например, до 40 или 60 секунд).

Важно: Это не решает проблему, а лишь маскирует ее. Пользователи будут дольше ждать «песочные часы» перед тем, как документ проведется или вылетит ошибка. Используйте этот метод только как временную меру, пока ищете истинную причину в коде или настройках.

Итог

Конфликт в ГрафикПлатежей при проведении ПКО — это сигнал о том, что механизмы взаиморасчетов перегружены. В 90% случаев помогает переход на оффлайн-модель расчета и оптимизация регламентных заданий. В остальных случаях требуется детальная отладка кода с использованием замера производительности, чтобы найти участок, удерживающий транзакцию слишком долго.

← На главную