При работе с распределенными информационными базами (РИБ) иногда можно столкнуться с загадочной ситуацией: при попытке загрузить сообщение обмена из узла-источника система выдает ошибку «Объект заблокирован», причем в качестве блокирующего сеанса указывает ваш собственный. Это может поставить в тупик, особенно если в консоли кластера виден только один ваш сеанс и никакие другие операции не выполняются.
Давайте подробно разберем, почему так происходит, на примере конкретной ситуации, и рассмотрим как частное решение, так и общие подходы к диагностике и устранению подобных блокировок.
Рассмотрим ситуацию, с которой столкнулся пользователь. После разделения бухгалтерской базы на две была настроена РИБ для переноса данных. Обмен работал исправно, но в один момент после обновления базы-источника загрузка сообщения в базу-приемник стала невозможной из-за ошибки блокировки.
Симптомы проблемы были следующими:
В ходе расследования выяснилась очень специфическая причина. Проблема возникала только при переносе документа «Операция (бухгалтерский и налоговый учет)», у которого в базе-источнике были выключены проводки (снят флаг активности). При этом сам документ мог загрузиться, а его движения (проводки) — нет. Именно в этот момент происходило зависание, которое приводило к блокировке объекта ПланОбмена.
Решение в данном конкретном случае оказалось простым, но не очевидным:
Перед формированием файла выгрузки в базе-источнике необходимо зайти в проблемный документ «Операция» и включить проводки (установить флаг активности). После этого сообщение формируется корректно и без проблем загружается в базе-приемнике. Это указывает на возможную ошибку или особенность логики обмена для данного объекта конфигурации при его определенном состоянии.
Этот пример показывает, как важно обращать внимание на состояние самих переносимых данных, а не только на настройки обмена.
Хотя вышеописанный случай имеет частное решение, проблемы с блокировками при обмене могут быть вызваны и более общими причинами. Рассмотрим основные из них.
Ошибка «объект заблокирован этим же пользователем» — классический признак «зависшего» или «фантомного» сеанса. Это сеанс, который некорректно завершился, но продолжает удерживать блокировки на сервере 1С или на уровне СУБД. Он может не отображаться в списке активных пользователей, что и вводит в заблуждение.
Причины: чаще всего это происходит из-за обрыва соединения при работе через удаленный рабочий стол (RDP) или веб-клиент.
Как устранить:
ragent). Это разорвет все соединения, поэтому выполнять его следует, убедившись, что в системе нет других активных пользователей.Процесс загрузки данных РИБ — это ресурсоемкая операция, которая блокирует таблицы для записи. Если в это же время в базе выполняются другие фоновые или регламентные задания, возникает конфликт блокировок.
Примеры конфликтующих процессов:
Как устранить: Настройте расписание обмена РИБ на время минимальной активности в системе, например, на ночные часы. Разнесите по времени выполнение различных ресурсоемких регламентных заданий, чтобы они не пересекались.
Если в одном файле обмена передается очень много изменений (например, после массового перепроведения документов за большой период или загрузки прайс-листа на десятки тысяч позиций), транзакция загрузки становится очень длинной. Это увеличивает время удержания блокировок и повышает риск таймаутов или ошибок.
Как устранить:
Взаимоблокировка — это ситуация, когда два процесса блокируют ресурсы, необходимые друг другу, и оба бесконечно ожидают их освобождения. СУБД обнаруживает такой «клинч» и принудительно завершает один из процессов («жертву»), что в 1С выглядит как ошибка.
Как устранить: Диагностика взаимоблокировок — сложная задача. Она требует анализа технологического журнала 1С и логов СУБД. В некоторых случаях, например, при использовании MS SQL Server, проблема может быть связана с избыточным параллелизмом выполнения запросов. Тогда может помочь установка параметра «max degree of parallelism» в значение 1 для экземпляра сервера.
Если простые методы не помогают, для поиска причин сложных блокировок следует использовать специализированные инструменты.
TLOCK (ожидание на блокировках) и TDEADLOCK (взаимоблокировки), вы сможете с высокой точностью определить, какие объекты, участки кода и сеансы вызывают конфликт.
БлокировкаДанных и его метод Заблокировать(). Это позволяет принудительно установить монопольную блокировку на нужные данные перед их чтением и изменением, что снижает вероятность конфликтов.