При работе в клиент-серверном варианте информационной базы пользователи нередко сталкиваются с ситуацией, когда при попытке открыть документ, отредактировать элемент справочника или сформировать отчет система выдает сообщение вида: «Ошибка блокировки объекта. Объект уже заблокирован: компьютер: PC7, пользователь: Иван, сеанс: 7, начат: ... приложение: Толстый клиент». Выясним причину такого поведения платформы и разберем по шагам, как снять блокировку без перезагрузки всего сервера.
Проанализируем механику возникновения этой ошибки. В конфигурациях на базе обычных форм (например, в «1С:Зарплата и Управление Персоналом 2.5») при интерактивном редактировании данных толстым клиентом используется пессимистическая блокировка данных. Это означает, что в момент начала редактирования или при формировании отчетов, требующих монопольного доступа к определенным временным данным или регистрам, платформа устанавливает блокировку от имени текущего сеанса пользователя.
Если на клиентском компьютере происходит внезапный сбой (например, отключение электричества, аварийная перезагрузка или падение операционной системы), рабочий компьютер не успевает корректно отправить серверу сетевой пакет завершения сеанса (TCP FIN или RST). Сервер 1С:Предприятия и СУБД продолжают считать соединение активным, сохраняя все захваченные им блокировки данных в памяти рабочих процессов (rphost). В результате другие пользователи или даже тот же самый сотрудник после повторного входа не могут получить доступ к заблокированным ресурсам.
Рассмотрим самый быстрый и надежный способ устранения проблемы, не требующий перезагрузки физического сервера или остановки службы кластера. Разберем по шагам порядок действий:
1С:Предприятия, под учетной записью с правами администратора.После удаления сеанса платформа моментально освобождает занятые им пессимистические и транзакционные блокировки, и формирование отчета или проведение документа становится доступным.
Бывают ситуации, когда графическая консоль администрирования недоступна или доступ к серверу ограничен только командной строкой. Рассмотрим альтернативные методы управления сеансами кластера.
1. Использование утилиты командной строки RAC
В составе платформы 1С поставляется утилита rac, работающая в связке со службой администрирования ras. С ее помощью можно найти и удалить зависший сеанс скриптом:
# Получение списка сеансов базы
rac session --cluster=<ИдентификаторКластера> list --ibase=<ИдентификаторБазы>
# Принудительное завершение конкретного сеанса по его UUID
rac session --cluster=<ИдентификаторКластера> terminate --session=<UUID_Сеанса>
2. Завершение зависших транзакций на уровне СУБД
Если сеанс уже удален из кластера 1С, но ошибка блокировки сохраняется на уровне СУБД (например, в MS SQL Server или PostgreSQL), транзакция может удерживать эксклюзивные блокировки таблиц. В таком случае администратор СУБД может найти блокирующий процесс через системные представления и принудительно завершить его командой KILL <SPID> в среде управления базой данных.
3. Перезапуск рабочего процесса кластера
В редких случаях, когда процесс rphost зависает и не реагирует на команды удаления сеансов из консоли, можно выполнить мягкий перезапуск проблемного рабочего процесса через свойства кластера или временно включить интервал перезапуска рабочих процессов.
Чтобы минимизировать появление «мертвых» блокировок при регулярных скачках сети или питания, настроим параметры самой информационной базы в консоли кластера 1С:
Также рекомендуется скорректировать сетевые таймауты операционной системы сервера: параметр KeepAliveTime в реестре сетевого стека Windows по умолчанию составляет 2 часа. Уменьшение этого интервала (например, до 5–10 минут) заставляет операционную систему сервера быстрее отправлять проверочные пакеты и разрывать аварийно оборванные соединения.
Поскольку внезапное отключение электроэнергии могло произойти непосредственно в момент записи данных, после снятия блокировок обязательно выполним проверку целостности информационной базы: