При работе в программе возникает ошибка удержания временных таблиц после серверного вызова: разбор поиска причины

27 сентября 2019

26.09.2019 18:31:38 была зафиксирована ошибка при проведении чека ККМ под пользователем АлборовПР. Это можно посмотреть в журнале регистрации:

В это время собирался полный техжурнал (не рекомендовано делать это на постоянной основе, за 1 час он достиг 5 Гб).

В техжурнале мы можем найти эту ошибку:

Временная отметка: 31:37.735009 (18 часов, 31 минута, 37 секунда, 735 миллисекунда).

Если подняться по техжурнале выше – мы видим откаты транзакций, а еще выше – их причина:

Конфликт блокировок при выполнении транзакции:

Microsoft SQL Server Native Client 11.0: Превышено время ожидания запроса на блокировку.

При попытке записи в таблицу _InfoRg25730

Это таблица марок внутреннего учета, по которой документ ЧекККМ хочет внести записи (скорее всего проставить отметку выбытия в марке).

Причиной может быть то, что в это время кто-то паралельно записывает данные в этот регистр, к примеру, по техжурналу это может быть установка статуса “Отгружен” ордерам из журнала документов продаж:

31:32.181003-20020967,SDBL,4,process=rphost,p:processName=ws-utap,t:clientID=62,t:applicationName=1CV8C,t:computerName=ws-op3,t:connectID=8694,SessionID=748,Usr=ТаратинаТ,AppID=1CV8C,Trans=1,Sdbl=’DELETE FROM InfoRg25730 WHERE Recorder = 496:907b000c297f9b6d11e9e0533e75957f’,Context=’Форма.Вызов : Обработка.ЖурналДокументовПродажи.Форма.КОформлениюНакладных.Модуль.УстановитьОрдерамСтатусОтгруженНаСервере

Обработка.ЖурналДокументовПродажи.Форма.КОформлениюНакладных.Форма : 2044 : ОрдерОбъект.Записать(РежимЗаписиДокумента.Проведение);

                Документ.РасходныйОрдерНаТовары.МодульОбъекта : 174 : ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ЭтотОбъект);

                               ОбщийМодуль.ПроведениеСерверУТ.Модуль : 321 : Объект.Движения.Записать();’

Платформа Заказчика — 1С 8.3, и, теоретически, управляемые блокировки и режим изоляции snapshot должны решать проблему параллельной записи, но тут у нас блокировка СКОРЕЕ ВСЕГО из за эскалации блокировки до уровня таблицы на сервере SQL. SQL делает это автоматически, при записи в таблицу более 4000 строк в рамках одной транзакции. И, действительно, профайлер показал такие эскалации:

Самым простым выходом может стать установка флагов трассировки на SQL, запрещающей эскалацию, согласно рекомендациям 1С:

https://its.1c.ru/db/metod8dev#content:5946:hdoc

флаг 1211

После установки флага сервер SQL необходимо перезагрузить.

Важно понимать, что данная ошибка возникает только в тот момент, когда кто-то проводит документ в 4000 и более марок одновременно с выпиской Чека и сервер не успевает его обработать за 20 секунд.

Не нашли то, что искали?

Оставьте свой номер телефона, и мы бесплатно проконсультируем вас по возникшим вопросам.

Расчет стоимости внедрения

Оставьте ваши контактные данные, и мы свяжемся с вами, чтобы уточнить детали вашего проекта.