«Объект заблокирован» в 1С: кто держит документ и как его освободить

· 10 мин

Содержание

Если 1С пишет, что объект заблокирован, документ или элемент справочника сейчас редактирует другой сеанс. Блокировку снимает только этот сеанс: пользователь закрывает форму, или администратор завершает его сеанс в списке активных пользователей (Администрирование → Обслуживание → Активные пользователи) или в консоли кластера серверов. Отдельной кнопки «разблокировать чужой объект» в 1С нет.

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

Почему 1С блокирует объект и какие бывают блокировки

Под словом «заблокирован» в 1С скрываются разные механизмы. Лечатся они по-разному, поэтому сначала определите свой.

Что видитеМеханизмКто снимает
Ошибка блокировки объекта. Объект уже заблокированОбъектная (пессимистическая) блокировка формыВладелец сеанса или администратор
Конфликт блокировок при выполнении транзакцииТранзакционная блокировка данных (управляемая или СУБД)Ждать или искать долгую транзакцию
В конфигураторе объект с замком, «захвачен в хранилище»Захват в хранилище конфигурацииТот, кто захватил, или администратор хранилища
В конфигураторе замок на объекте конфигурации поставщикаРежим поддержкиРазработчик, через настройку поддержки
Начало сеанса с информационной базой запрещеноБлокировка начала сеансов на всю базуАдминистратор базы или кластера

🔒 Объектная блокировка ставится, когда пользователь открыл документ и начал его менять. Пока форма модифицирована и не закрыта, второй человек не запишет тот же объект. Так 1С защищает от ситуации, когда двое правят одну накладную и последний молча затирает изменения первого.

⏳ Транзакционная блокировка живёт секунды или минуты: пока проводится документ, закрывается месяц, идёт обмен. Если транзакция длинная, остальные ждут, а по таймауту получают конфликт блокировок.

🧩 Захват в хранилище и поддержка касаются только разработчиков в конфигураторе. Бухгалтер с ними не сталкивается.

🚫 Блокировка начала сеансов включается перед обновлением или регламентными работами. Если её забыли снять, в базу не пускает никого.

Как найти, кто держит заблокированный объект

Начните с текста ошибки. Платформа обычно пишет номер сеанса, имя компьютера и пользователя. Например: Сеанс 14 Компьютер: BUH-03 Пользователь: Петрова А. Приложение: Тонкий клиент.

Дальше порядок такой:

  1. 📞 Позвоните или напишите этому пользователю. Чаще всего у него просто открыта накладная в соседней вкладке.
  2. 👥 Если человек не отвечает или уверяет, что 1С у него закрыта, откройте список сеансов: Администрирование → Обслуживание, группа «Служебные» → «Активные пользователи». Там видно пользователя, компьютер, время начала и время последней активности сеанса.
  3. 🖥️ В клиент-серверной базе тот же список доступен в консоли администрирования серверов 1С: Кластер → Информационные базы → <база> → Сеансы. Рядом с узлом «Сеансы» есть узел «Блокировки»: в нём видно, какой сеанс какой объект держит.
  4. 🔍 Из командной строки сеансы показывает утилита rac: rac cluster list выдаёт идентификатор кластера, затем rac session list --cluster=<id> — список сеансов.

Сеанс без активности несколько часов, начатый вчера, почти наверняка «мёртвый». Это ноутбук, который ушёл в сон с открытой 1С, или клиент, вылетевший без корректного закрытия.

В файловой базе консоли кластера нет. Список сеансов смотрят в «Активных пользователях» из пользовательского режима или в конфигураторе: Администрирование → Активные пользователи.

Снимаем блокировку объекта: от мягкого способа к жёсткому

Идите по шагам сверху вниз. Каждый следующий шаг грубее предыдущего.

Шаг 1. Попросить пользователя закрыть форму

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

Шаг 2. Подождать, если это транзакция

Если в тексте ошибки нет слов «объект уже заблокирован», а есть «конфликт блокировок» или «превышено максимальное время ожидания», значит кто-то сейчас проводит массив документов или закрывает месяц. Через несколько минут повторите запись. Если ошибка повторяется постоянно в одно и то же время, ищите регламентное задание или обмен, который запускается по расписанию.

Шаг 3. Завершить сеанс из 1С

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) в форме «Активные пользователи» есть команда завершения сеанса. Выделите строку нужного сеанса и завершите его.

Несохранённые изменения в этом сеансе пропадут. Предупредите пользователя заранее, если до него можно достучаться.

Шаг 4. Удалить сеанс в консоли кластера

Для клиент-серверной базы:

  1. Откройте «Администрирование серверов 1С Предприятия».
  2. Раскройте Кластер → Информационные базы → <база> → Сеансы.
  3. Найдите сеанс по номеру из текста ошибки, правой кнопкой → «Удалить».

То же через rac: команда rac session terminate --cluster=<id> --session=<id>. Если не уверены в параметрах вашей версии, смотрите rac help session.

Удаление сеанса обрывает работу пользователя на полуслове. Если в момент удаления шло проведение, транзакция откатится и документ останется в прежнем состоянии. Делать это стоит, когда вы убедились, что сеанс «мёртвый» или человек согласен.

Шаг 5. Файловая база: закрыть процесс на компьютере

В файловом режиме сеанс живёт внутри процесса 1cv8c.exe (тонкий клиент) или 1cv8.exe (толстый клиент, конфигуратор) на компьютере пользователя. Если клиент завис, снимите этот процесс в диспетчере задач на том компьютере, который указан в ошибке. Блокировка исчезнет вместе с процессом.

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

В каталоге файловой базы лежит служебный файл 1Cv8.1CL. Удалять его можно только когда в базе точно никого нет, включая регламентные задания и обмены. При работающих пользователях это верный путь к повреждению базы.

Если блокирована вся база

Ошибка Начало сеанса с информационной базой запрещено означает, что кто-то включил блокировку сеансов и не выключил. Варианты снятия:

  • в пользовательском режиме: Администрирование → Обслуживание, «Блокировка работы пользователей», снять флажок;
  • в клиент-серверной базе: свойства базы в консоли кластера, флажок «Блокировка начала сеансов включена»;
  • если блокировку ставили с кодом разрешения, войти можно с параметром запуска /UC<код>;
  • в файловой базе блокировка хранится в файле 1Cv8.cdn в каталоге базы. Удалить его — значит снять запрет. Перед этим убедитесь, что обновление или другая работа, ради которой ставили блокировку, завершена.

Блокировки объектов в конфигураторе: хранилище и поддержка

Объект захвачен в хранилище

При групповой разработке объект конфигурации, который правит один разработчик, захвачен в хранилище. Остальные видят его с замком и изменить не могут.

Нормальный путь: тот, кто захватил, помещает изменения в хранилище (Конфигурация → Хранилище конфигурации → Поместить изменения в хранилище) или отменяет захват. Если разработчик уволился или в отпуске, пользователь хранилища с административными правами может отменить чужой захват в окне хранилища. Незафиксированные изменения захватившего при этом в хранилище не попадут. Если они нужны, сначала выгрузите его рабочую конфигурацию в файл .cf с его компьютера.

Замок из-за поддержки

Объекты типовой конфигурации на поддержке поставщика по умолчанию не редактируются. Это тоже выглядит как «объект заблокирован».

Снять ограничение:

  1. Конфигурация → Поддержка → Настройка поддержки.
  2. Кнопка «Включить возможность изменения», подтвердить.
  3. Для нужного объекта выбрать правило «Объект поставщика редактируется с сохранением поддержки».

Перед тем как править типовой объект, подумайте о расширении конфигурации (доступно с платформы 8.3.6). Расширение не снимает конфигурацию с поддержки и не усложняет обновления.

Программная работа с блокировками объектов

Для разработчиков: объектную блокировку можно ставить и снимать из кода, но только свою. Снять из кода блокировку, которую держит чужой сеанс, нельзя. Это делается завершением того сеанса.

Пример обработки, которая меняет документ и корректно обрабатывает чужую блокировку:

ДокОбъект = Ссылка.ПолучитьОбъект();
Попытка
    ДокОбъект.Заблокировать();
Исключение
    Сообщить("Документ редактирует другой пользователь: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

ДокОбъект.Комментарий = "Исправлено обработкой";
ДокОбъект.Записать();
ДокОбъект.Разблокировать();

Что здесь происходит:

  • Заблокировать() ставит пессимистическую блокировку. Если объект уже держит другой сеанс, возникает исключение с тем же текстом, что видит пользователь.
  • Разблокировать() снимает блокировку текущего объекта. Если её не вызвать, блокировка снимется при уничтожении объекта или завершении сеанса.
  • Заблокирован() возвращает Истина, если блокировку держит именно этот экземпляр объекта.

В управляемых формах блокировку ставит сама форма при начале редактирования. Если в форме вы программно открываете для изменения другой объект, используйте ЗаблокироватьДанныеДляРедактирования(Ссылка, , УникальныйИдентификатор) и парную РазблокироватьДанныеДляРедактирования(Ссылка, УникальныйИдентификатор). Третьим параметром передаётся идентификатор формы: тогда блокировка снимется сама при её закрытии.

Обработки, которые в цикле переписывают тысячи документов, держат каждый объект и транзакцию. Запускайте их вне рабочего времени или порциями, иначе пользователи получат волну конфликтов блокировок.

Блокировки на уровне СУБД: MS SQL и PostgreSQL

Если в базе стоит автоматический режим управления блокировками или запрос висит долго, ожидание видно уже на стороне СУБД. Смотреть туда стоит, когда в 1С никакого «живого» сеанса-виновника нет, а записи всё равно ждут.

MS SQL Server. Кто кого ждёт, показывает представление запросов:

SELECT session_id, blocking_session_id, wait_type, wait_time, command
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;

Колонка blocking_session_id — номер соединения-виновника. Быстро посмотреть все соединения можно и через EXEC sp_who2.

PostgreSQL. Заблокированные процессы и их блокировщики:

SELECT pid, pg_blocking_pids(pid) AS blocked_by, state, now() - xact_start AS dur, query
FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0;

Мягкая отмена запроса — SELECT pg_cancel_backend(<pid>);, жёсткое завершение соединения — SELECT pg_terminate_backend(<pid>);. В MS SQL аналог жёсткого варианта — KILL <session_id>.

Убивать соединение на стороне СУБД — крайняя мера. Рабочий процесс 1С потеряет соединение, а пользователь получит ошибку посреди операции. Транзакция откатится, но предпочтительнее найти соответствующий сеанс 1С и завершить его штатно, через консоль кластера.

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

Как сделать, чтобы объекты не блокировались

Совсем без блокировок многопользовательская база не работает : это защита данных, а не сбой. Но частоту конфликтов можно сильно снизить.

  • 🚪 Закрывать документы после работы. Открытая с утра накладная держит блокировку, как только в ней что-то тронули.
  • ⏱️ Автозавершение неактивных сеансов. В клиент-серверной базе ограничьте время бездействия, чтобы забытые на ночь клиенты не висели. В типовых на БСП такую настройку ищите в разделе Администрирование, где настраиваются пользователи и права.
  • 🌙 Тяжёлое — на ночь. Закрытие месяца , перепроведение, групповая обработка, обмен с большим объёмом — вне рабочего времени.
  • 🔁 Обмены по расписанию без наложения. Если два регламентных задания пишут в одни регистры, разнесите их по времени.
  • ⚙️ Управляемый режим блокировок. В конфигурациях на автоматическом режиме блокировки идут на уровне СУБД целыми диапазонами. Перевод на управляемый режим (Свойства конфигурации → Режим управления блокировкой данных) — задача разработчика, с проверкой всех доработок.
  • 🛠️ Регламент обслуживания СУБД. Устаревшая статистика и фрагментированные индексы удлиняют запросы, а значит, и время удержания блокировок.
Диагностика: выберите симптом

Частые вопросы

Почему объект заблокирован, если пользователь из ошибки уже ушёл домой?
Его сеанс остался открытым: компьютер не выключен, либо клиент упал, а сервер ещё не понял, что связи нет. Завершите этот сеанс в «Активных пользователях» или в консоли кластера.
Можно ли запретить двум людям одновременно открывать один документ?
Открывать документ на просмотр могут сколько угодно человек. Блокировка ставится только в момент начала редактирования, и это стандартное поведение платформы.
Блокировка снимется сама, если ничего не делать?
Да, когда сеанс-владелец закроет форму или завершится. Брошенный сеанс в клиент-серверной базе может висеть долго, поэтому ждать неразумно, если работа стоит.
Чем объектная блокировка отличается от даты запрета изменения?
Объектная блокировка временная и связана с конкретным сеансом. Дата запрета изменения — постоянная настройка закрытого периода: её снимает или сдвигает ответственный за учёт в настройках запрета, а не завершение сеанса.
Кто имеет право завершать чужие сеансы?
Пользователь с административными правами в базе. В клиент-серверном варианте ещё и администратор кластера, если на кластер установлен пароль.