Снимаем зависшие блокировки сеансов и объектов в кластере 1С 8.3

· 10 мин

Содержание

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

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

Какие блокировки бывают на сервере 1С и какая из них мешает

Слово «блокировка» в 1С означает четыре разные вещи. От типа зависит, где её искать и как снимать.

ТипКак проявляетсяКто держитКак снять
Управляемая блокировка данныхКонфликт блокировок при выполнении транзакции, долгое проведениеТранзакция сеансаДождаться конца транзакции или завершить сеанс
Объектная (пессимистическая) блокировкаОбъект уже заблокирован с именем пользователя и номером сеансаОткрытая форма объектаЗакрыть форму или завершить сеанс
Блокировка СУБДВисят запросы, ожидания в SQL Server или PostgreSQLСоединение с СУБД рабочего процессаЗавершить сеанс 1С, в крайнем случае — процесс СУБД
Блокировка начала сеансовПользователей не пускают в базу, видно сообщение администратораНастройка базы в кластереСнять флажок в свойствах базы

📌 Первые три — «живые»: за ними стоит сеанс. Последняя — просто настройка, её никто не держит, её выключают.

💡 Сообщение об объектной блокировке само подсказывает виновника: в тексте есть пользователь, компьютер, номер сеанса и время начала. С этим номером идите сразу в консоль.

Как найти активную блокировку в консоли кластера

Консоль «Администрирование серверов 1С Предприятия» ставится вместе с сервером. Если оснастка не открывается или пишет об ошибке класса, зарегистрируйте radmin.dll той же версии, что и сервер, от имени администратора:

regsvr32 "C:\Program Files\1cv8\8.3.24.1586\bin\radmin.dll"

Номер версии в пути подставьте свой. Для 32-разрядной консоли путь будет в C:\Program Files (x86)\1cv8.

Дальше по дереву:

  1. Откройте Центральные серверы 1С:Предприятия → <имя сервера> → Кластеры → <кластер>.
  2. Разверните Информационные базы → <ваша база>. Если на базе задан пользователь, консоль спросит логин и пароль администратора этой базы.
  3. Откройте узел Блокировки. В списке — объект блокировки, сеанс, соединение и время установки.
  4. Перейдите в Сеансы той же базы. Найдите сеанс с номером из блокировки. Смотрите на колонки «Пользователь», «Компьютер», «Приложение», «Начало работы» и «Последняя активность».

🔍 На что смотреть в первую очередь:

  • 🕐 сеанс с последней активностью час назад и больше — вероятный «зависший»;
  • 🖥️ фоновое задание или регламентное — его лучше не обрывать, пока не выяснено, что оно делает;
  • 👤 один пользователь с двумя-тремя сеансами с одного компьютера — после аварийного закрытия клиента;
  • 🔁 сеанс конфигуратора — обновление или выгрузка .dt может идти долго, и это нормально.
Диагностика: выберите симптом

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

Консоль показывает текущую картину. Если конфликт уже прошёл, а надо понять причину, нужны журналы.

Журнал регистрации

В пользовательском режиме он находится в Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — Администрирование → Журнал регистрации.

Что даёт:

  1. Отбор по пользователю и номеру сеанса из текста ошибки. Видно, что человек делал перед конфликтом.
  2. События «Транзакция. Отмена» — откатившиеся транзакции, часто с текстом ошибки блокировки.
  3. Ошибки регламентных и фоновых заданий. Обмен или пересчёт итогов ночью — частый виновник утренних конфликтов.

Сами ожидания на блокировках журнал регистрации не пишет. Для них есть технологический журнал.

Технологический журнал

Создайте файл logcfg.xml в каталоге conf платформы на сервере, например C:\Program Files\1cv8\conf\logcfg.xml:

<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\techlog" history="24">
    <event><eq property="name" value="TTIMEOUT"/></event>
    <event><eq property="name" value="TDEADLOCK"/></event>
    <property name="all"/>
  </log>
</config>
  • ⏱️ TTIMEOUT — сеанс не дождался блокировки. В записи есть, кто ждал и кто мешал.
  • 🔄 TDEADLOCK — взаимоблокировка: два сеанса ждут друг друга.
  • 📦 TLOCK — каждая установка управляемой блокировки. Даёт полную картину, но на рабочей базе журнал растёт на гигабайты за час.

Включайте TLOCK на 15–30 минут во время воспроизведения проблемы и следите за свободным местом на диске. history="24" — срок хранения в часах. После разбора удалите или переименуйте logcfg.xml.

Платформа подхватывает изменения файла сама, перезапуск службы не нужен.

Как снять блокировку: завершение сеанса в консоли и через rac

Порядок — от мягкого к жёсткому. Переходите к следующему шагу, только если предыдущий не помог.

Шаг 1. Договориться с пользователем

Если владелец блокировки на месте, попросите закрыть форму или дождаться окончания операции. Ничего не теряется, транзакция завершается штатно.

Шаг 2. Завершить сеанс в консоли

В узле Сеансы базы выделите нужный сеанс, щёлкните правой кнопкой и выберите Удалить. Транзакция сеанса откатится, его блокировки освободятся.

Несохранённые данные пользователя пропадут, незавершённая транзакция откатится целиком. Если это закрытие месяца или большой обмен, работу придётся начинать заново.

Шаг 3. То же из командной строки через rac

Утилита rac работает через сервер администрирования ras. Его запускают на сервере кластера, порт по умолчанию 1545:

ras cluster --daemon

Затем по цепочке получаем идентификаторы:

rem 1. Идентификатор кластера
rac cluster list

rem 2. Идентификатор базы
rac infobase summary list --cluster=<cluster-uuid>

rem 3. Блокировки базы: у каждой есть session и connection
rac lock list --cluster=<cluster-uuid> --infobase=<infobase-uuid>

rem 4. Сеансы базы: ищем нужный session, user-name, host
rac session list --cluster=<cluster-uuid> --infobase=<infobase-uuid>

rem 5. Завершаем сеанс
rac session terminate --cluster=<cluster-uuid> --session=<session-uuid>

Если у кластера задан администратор, добавьте к командам --cluster-user=<логин> --cluster-pwd=<пароль>. Точный набор параметров для вашей версии покажет rac help session и rac help lock.

💡 Через rac удобно автоматизировать: скрипт в планировщике раз в час завершает сеансы с последней активностью старше суток. Но в скрипт обязательно заложите исключения для фоновых заданий и конфигуратора.

Шаг 4. Блокировка на уровне СУБД

Если в консоли пусто, а запросы висят, посмотрите, кто кого ждёт в самой СУБД. Для MS SQL Server:

SELECT r.session_id, r.blocking_session_id, r.wait_type,
       r.wait_time, DB_NAME(r.database_id) AS db, t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id <> 0;

Для PostgreSQL:

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

Цепочку «соединение СУБД → сеанс 1С» сопоставьте по колонкам о соединении с СУБД в списке сеансов консоли, и завершайте сеанс 1С, а не процесс СУБД. KILL в SQL Server или pg_terminate_backend — крайняя мера: рабочий процесс 1С получит обрыв соединения, и ошибку увидят все пользователи этого соединения.

Шаг 5. Крайний случай: сеанс не удаляется

Бывает, что сеанс после удаления снова появляется в списке или висит в статусе завершения. Тогда остаётся перезапуск службы «Агент сервера 1С:Предприятия 8.3».

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

Если и после перезапуска зависшие сеансы восстанавливаются, при остановленной службе переименуйте каталоги snccntx* в srvinfo\reg_1541 — там лежит кэш сеансовых данных. Переименуйте, а не удаляйте: так их можно вернуть. Остальное содержимое srvinfo не трогайте, там реестр кластера со списком баз.

Блокировка начала сеансов: как запретить и снова разрешить вход в базу

Это та блокировка, которую ставят сознательно — перед обновлением, выгрузкой или закрытием периода. Если её забыли снять, база «закрыта» для всех.

Через консоль кластера

Откройте свойства информационной базы (правой кнопкой по базе → Свойства). Поля:

ПолеЧто задаёт
Блокировка начала сеансов включенаГлавный флажок запрета входа
Начало / КонецПериод действия запрета
Сообщение о блокировкеТекст, который увидит пользователь
Код разрешенияПароль для входа в обход запрета
Блокировка регламентных заданий включенаОтдельный запрет фоновой автоматики

Чтобы снять блокировку, уберите оба флажка и нажмите ОК. Уже работающих пользователей запрет не выгоняет — их сеансы нужно завершить отдельно.

Через rac

rac infobase update --cluster=<cluster-uuid> --infobase=<infobase-uuid> ^
  --infobase-user=<админ базы> --infobase-pwd=<пароль> ^
  --sessions-deny=off --scheduled-jobs-deny=off

Для включения запрета те же параметры ставят в on и добавляют --denied-message, --permission-code, --denied-from, --denied-to.

Из самой программы

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

Войти в заблокированную базу администратор может с кодом разрешения в параметре запуска: /UC<код>. Команда для снятия блокировки без интерфейса:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv1c\buh" /N"Администратор" /P"пароль" /UC"12345" /C"РазрешитьРаботуПользователей"

Парный параметр /C"ЗавершитьРаботуПользователей" ставит блокировку и выгоняет сеансы — так делают перед ночным обновлением по расписанию.

Зависшие сеансы и тайм-ауты: что настроить, чтобы чистилось само

Большинство «вечных» блокировок оставляют клиенты, у которых оборвалась связь: ноутбук закрыли, VPN упал, терминальную сессию отключили, а не завершили.

⚙️ Что помогает:

  1. Время засыпания и завершения сеанса. В свойствах информационной базы в консоли есть параметры «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса» в секундах. Первый переводит сеанс без связи с клиентом в спящий режим и освобождает лицензию, второй завершает спящий сеанс через заданное время. Ориентир для офиса: засыпание 300 секунд, завершение 3600–7200.
  2. Тайм-аут ожидания управляемой блокировки — 20 секунд, в настройках он не меняется. Если конфликты частые, лечится не тайм-аутом, а сокращением транзакций.
  3. Перезапуск рабочих процессов. В свойствах кластера «Интервал перезапуска» и «Допустимый объём памяти» с флажком «Принудительно завершать проблемные процессы». Раздувшийся rphost перестаёт обслуживать сеансы, и они висят с блокировками.
  4. Терминальный сервер . В политиках RDP задайте лимит для отключённых сессий, например 2 часа. Иначе клиент 1С внутри отключённой сессии живёт сутками.
  5. Регламент. Включайте блокировку регламентных заданий на время обновления и не забывайте снимать её — иначе обмены и загрузка курсов молча перестанут работать.

Сеанс в спящем режиме сохраняет данные и восстанавливается, если клиент вернулся до истечения «времени завершения». Поэтому не ставьте завершение меньше 15–20 минут, иначе пользователи с нестабильной связью будут терять открытые документы.

Как не допускать блокировок на уровне кода конфигурации

Администратор тушит пожар, а источник обычно в коде доработок. Что проверить разработчику:

  • ✅ Свойство конфигурации «Режим управления блокировкой данных» — «Управляемый». В автоматическом режиме блокирует СУБД, и конфликты захватывают целые страницы таблиц.
  • ✅ Транзакция короткая: внутри нет вопросов пользователю, ожидания внешних сервисов, HTTP-запросов и чтения файлов.
  • ✅ Блокировка устанавливается до чтения остатков, а не после.
  • ✅ Разные процедуры блокируют ресурсы в одном порядке, например сначала регистр остатков, потом регистр взаиморасчётов. Иначе появляются взаимоблокировки.
  • ✅ Блокируется ровно то, что нужно: с отбором по складу и номенклатуре, а не весь регистр.

Пример правильной управляемой блокировки при списании остатков:

НачатьТранзакцию();
Попытка
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
    ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    Блокировка.Заблокировать();

    // Здесь читаем остатки по складу и записываем движения
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

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

Перед закрытием месяца или большим обменом
Выполнено: 0 / 5

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

Можно ли удалить одну блокировку, не завершая сеанс?
Нет. Ни консоль, ни rac не снимают отдельную управляемую блокировку. Она принадлежит транзакции и освобождается при её завершении или при завершении сеанса.
Почему сеанс фонового задания нельзя просто удалить?
Можно, но транзакция откатится, и задание начнётся заново по расписанию. Если это обмен, часть пакета придётся принимать повторно. Сначала посмотрите, что задание делает, в журнале регистрации.
Что делать, если забыт код разрешения?
Администратор кластера снимает флажок «Блокировка начала сеансов включена» в свойствах базы в консоли или командой rac infobase update с --sessions-deny=off. Код для этого не нужен, нужны права администратора базы.
Блокировки появились после перехода на PostgreSQL. Это нормально?
Сама СУБД не должна давать больше конфликтов. Чаще причина в устаревшей статистике и долгих запросах. Проверьте, выполняется ли регулярно VACUUM ANALYZE, и посмотрите долгие транзакции в pg_stat_activity.
Как снять блокировку в файловой базе?
В файловой базе нет кластера и консоли. Там управляемые блокировки устанавливаются на всю таблицу, а снимают их, закрывая сеансы пользователей на их компьютерах.