Почему не проводится чек ККМ в 1С:Розница и как решить проблему с превышением времени ожидания блокировки?

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

В работе розничных магазинов на базе решения 1С:Розница 2.2 / 2.3 стабильность кассовой линейки является критически важным фактором. Любая задержка при пробитии чека на рабочем месте кассира (РМК) приводит к очередям, недовольству покупателей и прямым финансовым потерям. Одной из самых коварных технических проблем является внезапное появление ошибки: «Ошибка проведения чека. Конфликт блокировок при выполнении транзакции. Превышено время ожидания запроса на блокировку».

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

Выясняем первопричину: почему триггером становится отключение электричества?

Рассмотрим ситуацию, когда сервер и кассы работали стабильно, но после внезапного отключения света и последующего перезапуска системы начались периодические зависания при проведении чеков. На первый взгляд кажется, что если в базе работает один кассир, конфликту блокировок взяться неоткуда. Однако аварийное завершение работы MS SQL Server под нагрузкой приводит к скрытым системным проблемам:

  1. Устаревание и повреждение статистик СУБД. При некорректном выключении сервера таблицы СУБД могут остаться с поврежденной или неактуальной статистикой распределения данных. Оптимизатор MS SQL Server строит планы выполнения запросов на основе этих статистик. Если они устарели, вместо быстрого поиска по индексу (Index Seek) СУБД начинает выполнять полное сканирование таблиц (Table Scan). Время выполнения простейших транзакций записи чека вырастает с миллисекунд до десятков секунд или даже минут.
  2. Фрагментация и разрушение индексов. Прерванные в момент отключения питания транзакции могут вызвать сильную фрагментацию индексов физических таблиц базы данных. Это существенно снижает общую производительность дисковой подсистемы при обращении к регистрам.
  3. Прерывание регламентных обменов. Авария прерывает процессы распределенных информационных баз (РИБ). На узлах обмена начинает лавинообразно копиться очередь изменений, которая при первом же успешном запуске пытается «протолкнуть» гигантский объем данных в центральную базу.

Давайте разберем по шагам, как именно эти факторы приводят к полной блокировке работы кассы.

Механизм блокировки: Эскалация блокировок (Lock Escalation) в MS SQL Server

Чтобы понять, почему фоновый обмен блокирует проведение чеков ККМ, разберем внутреннюю логику работы СУБД. Когда 1С запускает фоновое задание синхронизации данных, система считывает и записывает изменения. В штатном режиме СУБД накладывает строчные блокировки (Row Locks) — блокируются только те конкретные строки таблиц, которые обрабатываются в данный момент. Кассир при этом спокойно проводит чеки, так как его транзакции работают с другими строками.

Но что происходит, когда из-за сбоя в очереди обмена накапливается огромный пакет данных (например, 100 000 объектов объемом 260 МБ)?

Настройка MS SQL Server для минимизации блокировок

Для предотвращения подобных ситуаций необходимо правильно настроить сервер СУБД. Проанализируем две ключевые настройки, которые снижают вероятность взаимных блокировок в разы.

1. Включение режима версионирования строк (Read Committed Snapshot Isolation - RCSI)

По умолчанию в MS SQL Server операции чтения блокируются операциями записи. Если обмен записывает данные, кассир не может даже прочитать остатки по задействованным таблицам. Включение RCSI позволяет читающим транзакциям получать согласованную версию данных из базы tempdb, не дожидаясь окончания пишущих транзакций. Для включения RCSI выполним следующий SQL-скрипт:


ALTER DATABASE [ИмяВашейБазы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [ИмяВашейБазы] SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE [ИмяВашейБазы] SET MULTI_USER;

2. Настройка параметра MAXDOP (Max Degree of Parallelism)

Для баз данных 1С крайне рекомендуется ограничивать максимальную степень параллелизма. По умолчанию параметр MAXDOP равен 0 (использовать все доступные ядра процессора для одного запроса). При «тяжелом» обмене один запрос может занять все ядра процессора, вызвав зависание всей операционной системы и взаимные внутренние блокировки (deadlocks). Рекомендуется установить значение MAXDOP = 1 (или максимум 2–4 в зависимости от архитектуры процессора, но для 1С оптимально именно 1 для предотвращения распараллеливания запросов СУБД).

Пошаговый план решения проблемы и очистки зависшего обмена

Если кассы уже стоят, а сервер зациклился на попытках провести гигантский обмен, выполним следующие последовательные шаги по восстановлению работоспособности системы.

Шаг 1: Остановка зависших процессов и фоновых заданий

Прежде всего, необходимо прекратить текущие попытки обмена, которые блокируют таблицы. Зайдем в базу под правами администратора:

  1. Перейдем в раздел Администрирование -> Обслуживание -> Фоновые и регламентные задания.
  2. Найдем зависшие фоновые задания, выполняющие синхронизацию данных. Нажмем кнопку «Отменить».
  3. Если регламентное задание не реагирует на отмену, необходимо зайти в консоль кластера серверов 1С (или перезапустить службу 1C:Enterprise 8.3 Server Agent, если это допустимо в текущий момент времени) для принудительного завершения сеансов обмена. В крайнем случае может потребоваться перезапуск службы MS SQL Server.

Шаг 2: Обновление статистик и обслуживание таблиц СУБД

Чтобы исключить влияние некорректных планов запросов, возникших после отключения электричества, запустим принудительное обновление статистик. Откроем SQL Server Management Studio (SSMS), создадим новый запрос к нашей базе данных и выполним:


USE [ИмяВашейБазы];
EXEC sp_updatestats;

Эта процедура быстро обновит статистику по всем таблицам базы данных, что позволит оптимизатору строить корректные и быстрые планы запросов.

Шаг 3: Порционная обработка и очистка очереди обмена

Попытка загрузить пакет в 260 МБ «в лоб» гарантированно приведет к повторному зависанию. Нам необходимо временно разгрузить очередь:

  1. Используем стандартную обработку «Регистрация изменений для обмена данными» (ее можно открыть через функции для технического специалиста).
  2. Найдем узел обмена, на котором скопилось огромное количество зарегистрированных изменений (те самые 100 000 объектов).
  3. Проанализируем состав изменений. Часто львиную долю объема занимают не документы, а регистры сведений (например, история версий объектов, штрихкоды, лог-файлы или старые цены).
  4. Удалим регистрацию изменений для некритичных тяжелых объектов (например, регистров сведений, не влияющих напрямую на остатки и продажи текущего дня). Для этого выберем нужный класс объектов в дереве обработки, нажмем правую кнопку мыши и выберем «Отменить регистрацию».
  5. Если необходимо передать документы, разобьем выгрузку на небольшие порции с помощью уменьшения интервала выгрузки или ручной регистрации объектов частями.

Шаг 4: Временное увеличение таймаута ожидания блокировок

Если провести обмен жизненно необходимо, но он все же вызывает кратковременные подвисания касс, мы можем временно увеличить время ожидания блокировки, чтобы транзакции кассиров не падали по таймауту в 20 секунд, а успевали дождаться своей очереди. Для этого зайдем в Конфигуратор -> Администрирование -> Параметры информационной базы:

  1. Найдем параметр «Время ожидания блокировки данных».
  2. Временно увеличим его значение с 20 до 120 секунд.
  3. Нажмем «Применить». Теперь касса при возникновении блокировки зависнет на более длительное время, но дождется завершения записи пакета обмена и проведет чек успешно, без генерации ошибки. После завершения импорта тяжелого пакета вернем значение параметра обратно к 20 секундам.

Шаг 5: Оптимизация расписания обменов РИБ

Чтобы избежать подобных коллизий в будущем, проанализируем и перенастроим расписание регламентных заданий:

Применяя предложенный комплекс мер, мы не только решим текущую проблему с зависанием проведения чеков ККМ, но и существенно повысим общую отказоустойчивость всей ИТ-инфраструктуры розничной точки продаж.

← На главную