К статье
Практический материал

Администрирование · 11 мин

Как снять управляемую блокировку в 1С

Как найти и снять управляемую блокировку в 1С: через консоль кластера, монитор СУБД и код. Причины зависших блокировок, типичные ошибки и FAQ.

Управляемая блокировка в 1С появляется, когда один сеанс захватывает объект (документ, элемент справочника, регистр) для изменения, а другой пытается обратиться к тем же данным. В норме такая блокировка живёт доли секунды и снимается автоматически при завершении транзакции. Проблема возникает, когда сеанс «завис», пользователь закрыл программу некорректно или транзакция оборвалась — тогда блокировка остаётся, и коллеги видят ошибку «Конфликт блокировок при выполнении транзакции».

Снять управляемую блокировку можно несколькими способами: завершить проблемный сеанс через консоль кластера серверов 1С, убить зависший процесс на СУБД, дождаться таймаута или принудительно перезапустить сервер. Выбор зависит от того, где именно «застряла» блокировка — на уровне сервера 1С или на уровне СУБД (MS SQL, PostgreSQL).

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

Как понять, что блокировка управляемая, а не транзакционная

Признак управляемой блокировки — характерное сообщение об ошибке: «Конфликт блокировок при выполнении транзакции: превышено максимальное время ожидания предоставления блокировки». В тексте ошибки обычно указано пространство блокировки (например, «Документ.РеализацияТоваровУслуг») и поля, по которым установлен захват.

Транзакционная блокировка СУБД выглядит иначе: ошибка приходит от самой СУБД (например, «Lock request time out period exceeded» в MS SQL). Различие важно, потому что инструменты диагностики разные: для управляемых блокировок анализируют сеансы 1С и технологический журнал, для транзакционных — мониторинг СУБД.

Способ 1. Завершить сеанс через консоль кластера

Самый безопасный и самый частый способ — найти и завершить сеанс, удерживающий блокировку. Для этого нужны права администратора кластера серверов 1С.

Порядок действий в консоли кластера
  1. 1
    Откройте оснастку «Администрирование серверов 1С Предприятия» на сервере или на машине администратора.
  2. 2
    Разверните нужный кластер → ветка «Сеансы».
  3. 3
    Отсортируйте сеансы по времени начала или найдите пользователя, который сообщил о проблеме.
  4. 4
    Обратите внимание на сеансы с длительным «временем вызова СУБД» или спящие сеансы, начавшиеся давно.
  5. 5
    Выделите подозрительный сеанс, нажмите «Удалить» (или контекстное меню → «Завершить сеанс»).
  6. 6
    Попросите пользователя повторить операцию — ошибка блокировки должна исчезнуть.

Если пользователей много и найти виновника сложно, ориентируйтесь на время появления ошибки у пострадавшего сеанса: блокирующий сеанс обычно стартовал чуть раньше и до сих пор активен. Также помогает колонка «Прочитано (текущее)» и «Записано (текущее)» — зависший в транзакции сеанс часто показывает ненулевую текущую активность без прогресса.

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

Способ 2. Снять зависшую блокировку на уровне СУБД

Если консоль кластера не помогает или блокировка удерживается на уровне СУБД (бывает при аварийном обрыве соединения, когда сеанс 1С уже умер, а процесс на SQL-сервере остался), работайте с мониторингом СУБД.

MS SQL Server

Откройте SQL Server Management Studio и выполните запрос, показывающий блокирующие процессы. Найдите SPID, который блокирует остальных (поле blocking_session_id у жертв указывает на него), проверьте, что это действительно зависший процесс 1С (по program_name и login_time), и завершите его командой KILL.

sql
SELECT session_id, blocking_session_id, wait_type, wait_time, last_wait_type FROM sys.dm_exec_requests WHERE blocking_session_id <> 0; -- затем: KILL <session_id>;

PostgreSQL

В PostgreSQL зависшие блокировки видны в представлении pg_locks в связке с pg_stat_activity. Найдите процесс, удерживающий блокировку (granted = true), и завершите его функцией pg_terminate_backend(pid). Перед завершением убедитесь, что процесс действительно «мертвый», а не выполняет длинный регламентный запрос.

sql
SELECT pid, state, query_start, wait_event FROM pg_stat_activity WHERE state <> 'idle'; SELECT pg_terminate_backend(<pid>);

Способ 3. Таймауты и автоматическое снятие

Платформа 1С по умолчанию ждёт предоставления блокировки ограниченное время (по умолчанию — порядка 20 секунд для ожидания в транзакции), после чего выдаёт ошибку ожидания. Но сама блокировка при этом не снимается — она живёт, пока жив блокирующий сеанс.

Автоматически блокировки снимаются в трёх случаях: завершение транзакции (фиксация или откат), завершение сеанса, аварийный перезапуск рабочего процесса или сервера 1С. Спящие сеансы можно настроить на автоматическое завершение: в свойствах информационной базы в консоли кластера задайте «Интервал перезапуска» и параметры завершения спящих сеансов (время засыпания и завершения). Это профилактика, а не экстренное средство, но она заметно снижает количество зависших блокировок от «забытых» клиентов.

Диагностика: как найти виновника через технологический журнал

Когда ошибки блокировок повторяются регулярно, простого снятия недостаточно — нужно найти источник. Включите технологический журнал (файл logcfg.xml в каталоге conf сервера 1С) с событиями TLOCK, TTIMEOUT и TDEADLOCK. В логах будет видно, какой сеанс, в каком контексте и какое пространство блокировки захватил.

Ошибка «Конфликт блокировок...»Управляемая блокировка платформы

Ищите блокирующий сеанс в консоли кластера и в событиях TLOCK технологического журнала

Ошибка от СУБД (timeout/deadlock)Транзакционная блокировка СУБД

Смотрите мониторинг MS SQL или PostgreSQL, события TDEADLOCK в техжурнале

Сеанс висит часами без активностиСпящий сеанс с незавершённой транзакцией

Проверьте время начала сеанса и настройте автозавершение спящих сеансов

Блокировки повторяются в одно времяКонкуренция регламентных заданий

Разнесите по времени обмены, проведение документов и расчёт итогов

Также полезна обработка «Управление блокировками» или типовая консоль кода, позволяющая посмотреть активные сеансы программно. В файловом варианте базы управляемые блокировки снимаются проще: достаточно завершить сеанс через «Администрирование → Активные пользователи» в самой 1С.

Профилактика: как уменьшить число конфликтов блокировок

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

  • Короткие транзакции. Чем дольше транзакция, тем дольше удерживаются блокировки. Не выполняйте внутри транзакции обмен данными, запросы к внешним сервисам и интерактивные диалоги с пользователем.
  • Правильный порядок захвата. Если разный код блокирует одни и те же объекты в разном порядке, возникают взаимоблокировки. Унифицируйте порядок обращения к данным.
  • Разнесение нагрузки. Регламентные задания (обмены, групповое перепроведение, расчёт себестоимости) не должны выполняться одновременно и в часы пиковой работы пользователей.
  • Избыточные блокировки в коде. Проверьте, не устанавливаются ли исключительные блокировки там, где достаточно разделяемой, и не захватываются ли целые таблицы вместо конкретных записей.

Типичные ошибки при снятии блокировок

Типичные ошибки
01
Перезапуск всего сервера 1С из-за одной зависшей блокировки — все пользователи теряют несохранённую работу, хотя достаточно завершить один сеанс.
02
Завершение сеанса без проверки — под блокировкой мог оказаться длинный, но живой регламентный процесс; его откат займёт ещё больше времени.
03
Поиск «таблицы блокировок» в базе для ручной очистки — управляемые блокировки хранятся в памяти менеджера блокировок, чистить в СУБД нечего.
04
Игнорирование повторяющихся конфликтов — снятие блокировки лечит симптом; без анализа техжурнала и кода проблема вернётся.
05
Ожидание, что блокировка «сама рассосётся» — пока жив блокирующий сеанс, она не снимется никогда.

Отдельно выделим ситуацию с «фантомными» сеансами: пользователь давно вышел, а сеанс в консоли кластера висит. Такие сеансы могут удерживать блокировки, если соединение оборвалось некорректно. Их нужно завершать вручную, а для профилактики — настроить автоматическое завершение спящих сеансов в свойствах базы.

Итог

Что важно запомнить

Управляемая блокировка снимается завершением сеанса, который её держит: через консоль кластера 1С или, при зависании на уровне СУБД, через мониторинг SQL Server / PostgreSQL. Таблицы блокировок вручную не чистят. Повторяющиеся конфликты требуют анализа технологического журнала и доработки кода, а не постоянного ручного снятия.

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

Блокировка висит, но сеанса-виновника в консоли кластера нет. Что делать?

Скорее всего, блокировка удерживается на уровне СУБД осиротевшим процессом. Проверьте активные процессы в MS SQL (sys.dm_exec_requests) или PostgreSQL (pg_stat_activity), найдите процесс с давним временем начала от сервера 1С и завершите его. Если процессов нет — перезапустите рабочий процесс rphost кластера: это сбросит весь менеджер блокировок, но затронет всех пользователей этого процесса.

Можно ли снять блокировку программно из кода 1С?

Явной команды «снять чужую блокировку» нет — это было бы нарушением целостности данных. Блокировка снимается только завершением транзакции или сеанса. Программно можно найти и завершить сеанс через COM-соединение с агентом кластера (V83.COMConnector) — это способ автоматизировать то же самое действие, что делает администратор в консоли.

Чем управляемая блокировка отличается от объектной (оптимистичной)?

Объектная (оптимистичная) блокировка срабатывает в момент записи: платформа сравнивает версию объекта и выдаёт ошибку «Данные были изменены другим пользователем». Управляемая блокировка устанавливается заранее на время транзакции и заставляет второй сеанс ждать. Первая не требует снятия — достаточно перечитать объект и повторить изменения.

Почему ошибка блокировки возникает у одного и того же пользователя?

Частая причина — у пользователя открыто два сеанса (два окна 1С или зависший старый сеанс), и один блокирует другой. Проверьте список сеансов этого пользователя в консоли кластера. Вторая причина — регламентное задание, выполняющееся от его имени в то же время.

Опасно ли завершать сеанс пользователя для снятия блокировки?

Потеряются только несохранённые данные этого сеанса — уже записанные в базу документы не пострадают, незавершённая транзакция будет откачена. Перед завершением предупредите пользователя и попросите его закрыть программу самостоятельно. Никогда не завершайте сеансы, выполняющие обновление конфигурации базы данных или длительные регламентные операции, без необходимости.

Помогает ли перезагрузка сервера 1С от блокировок?

Да, перезапуск службы агента сервера 1С снимает все управляемые блокировки, так как они хранятся в памяти. Но это крайняя мера: все сеансы разрываются, пользователи теряют несохранённые данные. Используйте перезапуск только если завершение отдельных сеансов не помогло или консоль кластера недоступна.