Документ занят другим пользователем: кто его держит и как освободить
Содержание
Чтобы узнать, кто открыл документ в 1С, сначала прочитайте само сообщение об ошибке: в 8.3 при конфликте объектной блокировки платформа обычно пишет номер сеанса, пользователя, компьютер и приложение. Если этого мало, откройте Администрирование → Обслуживание → «Активные пользователи» и найдите сеанс по номеру. В клиент-серверной базе ещё точнее покажет консоль администрирования серверов: у каждой базы там есть узел «Блокировки».
Способ выбирают по ситуации. Документ просто держит коллега с открытой формой — хватит списка активных пользователей и звонка. Запись падает с ошибкой ожидания блокировки, а форму никто не открывал — смотрите консоль кластера, технологический журнал и сторону СУБД. Сеанс завис после обрыва связи — его завершают принудительно.
Почему 1С считает документ занятым: два разных механизма
Под словами «документ заблокирован» скрываются две разные вещи. От того, какая из них у вас, зависит, где искать виновника.
Объектная блокировка: кто-то редактирует форму
Простое открытие документа ничего не блокирует. Блокировка появляется, когда пользователь изменил что-то в форме и ещё не записал. С этого момента платформа считает объект занятым его сеансом. Второй пользователь может открыть документ на просмотр, но при попытке изменить его получит сообщение вида Не удалось заблокировать объект. Объект уже заблокирован с данными о сеансе-владельце.
Блокировка живёт, пока открыта изменённая форма или пока жив сеанс. Закрыл форму без записи, записал, вышел из программы — объект свободен.
Транзакционная блокировка: конфликт при записи
Второй тип возникает в момент записи или проведения. Пока одна транзакция пишет данные (документ, регистры, остатки), другая ждёт. Если ожидание затянулось, пользователь видит:
- 🔒
Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки— в управляемом режиме, по умолчанию ждать приходится около 20 секунд; - 🔁 сообщение о взаимоблокировке — две транзакции ждут друг друга, СУБД или менеджер блокировок прерывает одну из них;
- 🗄 ошибку СУБД о блокировке — в базах с автоматическим режимом блокировок, где их ставит сама СУБД.
Здесь виновник — не «тот, кто открыл документ», а тот, чья транзакция в эту секунду пишет те же данные: закрытие месяца , групповое перепроведение, обмен, регламентное задание.
| Признак | Объектная блокировка | Транзакционная блокировка |
|---|---|---|
| Когда видна | При попытке изменить форму | При записи или проведении |
| Кто виноват | Пользователь с несохранённой формой | Долгая операция в другом сеансе |
| Сколько длится | Пока открыта форма или жив сеанс | Пока идёт транзакция |
| Где искать | Текст ошибки, активные пользователи | Консоль кластера, техжурнал, СУБД |
Режим управления блокировками задаётся в свойствах конфигурации: «Автоматический», «Управляемый» или «Автоматический и управляемый». Типовые конфигурации на 8.3 работают в управляемом режиме.
Как узнать, кто открыл документ, не выходя из программы
Шаг 1. Прочитайте сообщение целиком
Не закрывайте окно ошибки сразу. В тексте объектной блокировки обычно есть номер сеанса, имя пользователя, имя компьютера, тип приложения и время начала сеанса. Этого часто достаточно: видно, что документ держит, например, Петрова на компьютере BUH-03 в тонком клиенте.
💡 Скопируйте текст сообщения в заметку. Номер сеанса пригодится, если пользователь с таким именем работает в двух окнах сразу.
Шаг 2. Найдите сеанс в списке активных пользователей
В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП:
- Откройте
Администрирование → Обслуживание. - Нажмите ссылку «Активные пользователи».
- Найдите строку с нужным номером сеанса или пользователем.
В списке видны пользователь, компьютер, приложение, время начала работы и номер сеанса. Тот же список открывается через Все функции → Стандартные → Активные пользователи, если команда «Все функции» включена в настройках программы.
Шаг 3. Свяжитесь с пользователем
Самый безопасный вариант — попросить записать или закрыть документ. Принудительное завершение сеанса уничтожит его несохранённые изменения, а он мог полчаса заполнять табличную часть.
Если в списке один и тот же пользователь висит в нескольких сеансах с разных компьютеров, учётной записью пользуются несколько человек. Тогда номер сеанса и имя компьютера — единственный способ понять, кто именно держит документ.
Как найти владельца блокировки в консоли администрирования серверов 1С
В клиент-серверной базе консоль кластера показывает больше, чем форма внутри программы. Она видит сеансы всех баз кластера, фоновые задания и сами блокировки.
Через графическую консоль
- Запустите «Администрирование серверов 1С:Предприятия» на сервере или на машине администратора.
- Раскройте
Central 1C:Enterprise 8.3 servers → <сервер> → Кластеры → <кластер> → Информационные базы → <база>. - Откройте узел «Блокировки». В списке видны объекты и сеансы, которые их держат.
- Перейдите в узел «Сеансы» этой базы и найдите сеанс по номеру: там пользователь, компьютер, приложение, время начала и последней активности.
Фоновые задания и регламентные операции тоже видны как сеансы, у них в колонке приложения указано фоновое задание. Если блокировку держит именно такой сеанс, звонить некому: ждите окончания или разбирайтесь, почему задание выполняется так долго.
Если консоль не открывается и пишет про отсутствие оснастки, перерегистрируйте библиотеку radmin.dll нужной версии платформы от имени администратора:
cd "C:\Program Files\1cv8\8.3.24.1691\bin"
regsvr32 radmin.dll
Номер версии в пути подставьте свой: он должен совпадать с версией платформы на сервере.
Через rac из командной строки
Если графической консоли нет или сервер на Linux, используйте утилиту rac. Она работает через службу ras, которая должна быть запущена. Базовая последовательность:
rac cluster list
rac infobase summary list --cluster=<uuid-кластера>
rac session list --cluster=<uuid-кластера> --infobase=<uuid-базы>
rac lock list --cluster=<uuid-кластера> --infobase=<uuid-базы>
Если на кластере заданы администраторы, добавьте --cluster-user и --cluster-pwd. Полный список параметров для каждого режима показывает rac help.
В выводе lock list у каждой блокировки указан идентификатор сеанса. По нему находите строку в session list и видите пользователя и компьютер.
Журнал регистрации и технологический журнал: когда виновник уже ушёл
Активные пользователи и консоль показывают только текущую картину. Если блокировка уже снялась, а вопрос «кто это был» остался, нужны журналы.
Что видно в журнале регистрации
Журнал не записывает факт открытия формы, поэтому «кто просто смотрел документ» он не покажет. Зато в нём видно, кто и когда документ менял, проводил и в каком сеансе это было.
- Откройте
Администрирование → Обслуживание→ «Журнал регистрации». - Нажмите «Установить отбор».
- В поле «Данные» выберите нужный документ, в событиях оставьте изменение и проведение данных.
- Отдельно отберите записи с уровнем «Ошибка» за то же время — там могут быть сообщения о конфликтах, если конфигурация их регистрирует.
- Зная номер сеанса из текста ошибки, отберите журнал по этому сеансу и посмотрите, что он делал в те минуты.
Так обычно и находят виновника транзакционной блокировки: в соседнем сеансе в то же время шло групповое проведение или обработка закрытия месяца.
Технологический журнал для повторяющихся конфликтов
Если ошибка ожидания блокировки появляется каждый день, включите сбор событий TLOCK, TTIMEOUT и TDEADLOCK на сервере. Создайте файл logcfg.xml в каталоге conf платформы, например C:\Program Files\1cv8\conf\:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\1C_TechLog\locks" history="24">
<event>
<eq property="name" value="TLOCK"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<property name="all"/>
</log>
</config>
history="24" значит, что логи хранятся 24 часа. Событие TTIMEOUT показывает, какой сеанс не дождался блокировки и какие сеансы ему мешали. TDEADLOCK описывает взаимоблокировку целиком.
Техжурнал на нагруженном сервере быстро занимает диск. Пишите его на отдельный том, собирайте день-два и удаляйте logcfg.xml, когда данные собраны.
Сторона СУБД
В базах на MS SQL Server с автоматическим режимом блокировок полезно посмотреть, кто кого ждёт на уровне СУБД:
SELECT r.session_id, r.blocking_session_id, r.wait_type,
r.wait_time, s.host_name, s.program_name
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON s.session_id = r.session_id
WHERE r.blocking_session_id <> 0;
Учтите: все соединения идут от рабочих процессов 1С, поэтому в host_name будет сервер 1С, а не компьютер бухгалтера. Связать соединение СУБД с сеансом 1С помогают сведения о соединении с СУБД в свойствах сеанса в консоли кластера.
Как снять блокировку документа: от безопасного к радикальному
Двигайтесь по списку сверху вниз и переходите к следующему пункту, только если предыдущий не помог.
| Способ | Когда подходит | Что теряется |
|---|---|---|
| Попросить пользователя закрыть форму | Человек на месте | Ничего |
| Подождать конец операции | Держит фоновое задание или закрытие месяца | Время |
| Завершить один сеанс | Пользователя нет, сеанс завис | Несохранённые правки этого сеанса |
| Блокировка работы пользователей | Нужно освободить всю базу | Сеансы всех пользователей |
| Перезапуск службы агента сервера | Сеансы не завершаются из консоли | Работа всех баз кластера |
Завершить конкретный сеанс
Из программы: в списке «Активные пользователи» выделите сеанс и нажмите «Завершить сеанс». В клиент-серверной базе программа может запросить имя и пароль администратора кластера.
Из консоли: в узле «Сеансы» базы щёлкните сеанс правой кнопкой и выберите удаление. Через rac:
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса>
Завершённый сеанс теряет всё, что пользователь не записал. Предупредите его, если это возможно. Сеанс фонового задания прерывайте, только понимая, что за задание: оборванный обмен или закрытие месяца придётся запускать заново.
Файловая база
Консоли кластера у файловой базы нет. Порядок такой:
- Найдите пользователя в «Активных пользователях» и попросите выйти.
- Если нужно освободить всю базу, включите
Администрирование → Обслуживание→ «Блокировка работы пользователей»: программа предупредит пользователей и завершит их сеансы. - Если сеанс завис после сбоя, на компьютере пользователя или на терминальном сервере завершите процесс
1cv8c.exe(тонкий клиент) или1cv8.exeв диспетчере задач. Несохранённые данные этого пользователя пропадут.
Перезапуск службы — крайняя мера
Если сеанс не удаляется из консоли, а блокировка висит, остаётся перезапустить службу «Агент сервера 1С:Предприятия 8.3» на сервере. Это обрывает сеансы всех пользователей всех баз кластера, включая тех, кто к проблемному документу отношения не имеет. Делайте это вне рабочего времени или после общего предупреждения. Перед перезапуском убедитесь, что не идёт обновление или регламентная операция с базой.
Как сделать, чтобы документы реже оказывались заблокированными
Большая часть конфликтов решается организационно, без программиста.
- 🕗 Тяжёлое — на вечер. Групповое перепроведение, закрытие месяца, полный обмен с другой базой ставьте на время, когда пользователи не проводят документы.
- 💾 Не держать изменённую форму часами. Заполнили часть документа — запишите. Ушли на обед — запишите или закройте. Записанный, но не проведённый документ блокировку не держит.
- 👤 У каждого своя учётная запись. Общий логин «Бухгалтер» на троих делает поиск виновника гаданием.
- 💤 Спящие сеансы. В свойствах информационной базы в консоли кластера есть параметры «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса». Разумные значения помогают серверу самому убирать сеансы, оставшиеся после обрыва связи.
- 🔧 Управляемый режим блокировок. Если база на доработанной конфигурации всё ещё в автоматическом режиме, конфликтов на уровне СУБД будет больше. Перевод в управляемый режим — работа программиста с проверкой кода записи, а не переключение одной галочки.
- ⏱ Короткие транзакции в доработках. Обработки, которые в одной транзакции перебирают тысячи документов, держат блокировки минутами. Их переписывают на запись порциями.