Снимаем зависшие блокировки сеансов и объектов в кластере 1С 8.3
Содержание
Удалить блокировку на сервере 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С:Предприятия → <имя сервера> → Кластеры → <кластер>. - Разверните
Информационные базы → <ваша база>. Если на базе задан пользователь, консоль спросит логин и пароль администратора этой базы. - Откройте узел
Блокировки. В списке — объект блокировки, сеанс, соединение и время установки. - Перейдите в
Сеансытой же базы. Найдите сеанс с номером из блокировки. Смотрите на колонки «Пользователь», «Компьютер», «Приложение», «Начало работы» и «Последняя активность».
🔍 На что смотреть в первую очередь:
- 🕐 сеанс с последней активностью час назад и больше — вероятный «зависший»;
- 🖥️ фоновое задание или регламентное — его лучше не обрывать, пока не выяснено, что оно делает;
- 👤 один пользователь с двумя-тремя сеансами с одного компьютера — после аварийного закрытия клиента;
- 🔁 сеанс конфигуратора — обновление или выгрузка
.dtможет идти долго, и это нормально.
Журнал регистрации и технологический журнал: кто и что заблокировал
Консоль показывает текущую картину. Если конфликт уже прошёл, а надо понять причину, нужны журналы.
Журнал регистрации
В пользовательском режиме он находится в Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — Администрирование → Журнал регистрации.
Что даёт:
- Отбор по пользователю и номеру сеанса из текста ошибки. Видно, что человек делал перед конфликтом.
- События «Транзакция. Отмена» — откатившиеся транзакции, часто с текстом ошибки блокировки.
- Ошибки регламентных и фоновых заданий. Обмен или пересчёт итогов ночью — частый виновник утренних конфликтов.
Сами ожидания на блокировках журнал регистрации не пишет. Для них есть технологический журнал.
Технологический журнал
Создайте файл 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 упал, терминальную сессию отключили, а не завершили.
⚙️ Что помогает:
- Время засыпания и завершения сеанса. В свойствах информационной базы в консоли есть параметры «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса» в секундах. Первый переводит сеанс без связи с клиентом в спящий режим и освобождает лицензию, второй завершает спящий сеанс через заданное время. Ориентир для офиса: засыпание 300 секунд, завершение 3600–7200.
- Тайм-аут ожидания управляемой блокировки — 20 секунд, в настройках он не меняется. Если конфликты частые, лечится не тайм-аутом, а сокращением транзакций.
- Перезапуск рабочих процессов. В свойствах кластера «Интервал перезапуска» и «Допустимый объём памяти» с флажком «Принудительно завершать проблемные процессы». Раздувшийся rphost перестаёт обслуживать сеансы, и они висят с блокировками.
- Терминальный сервер . В политиках RDP задайте лимит для отключённых сессий, например 2 часа. Иначе клиент 1С внутри отключённой сессии живёт сутками.
- Регламент. Включайте блокировку регламентных заданий на время обновления и не забывайте снимать её — иначе обмены и загрузка курсов молча перестанут работать.
Сеанс в спящем режиме сохраняет данные и восстанавливается, если клиент вернулся до истечения «времени завершения». Поэтому не ставьте завершение меньше 15–20 минут, иначе пользователи с нестабильной связью будут терять открытые документы.
Как не допускать блокировок на уровне кода конфигурации
Администратор тушит пожар, а источник обычно в коде доработок. Что проверить разработчику:
- ✅ Свойство конфигурации «Режим управления блокировкой данных» — «Управляемый». В автоматическом режиме блокирует СУБД, и конфликты захватывают целые страницы таблиц.
- ✅ Транзакция короткая: внутри нет вопросов пользователю, ожидания внешних сервисов, HTTP-запросов и чтения файлов.
- ✅ Блокировка устанавливается до чтения остатков, а не после.
- ✅ Разные процедуры блокируют ресурсы в одном порядке, например сначала регистр остатков, потом регистр взаиморасчётов. Иначе появляются взаимоблокировки.
- ✅ Блокируется ровно то, что нужно: с отбором по складу и номенклатуре, а не весь регистр.
Пример правильной управляемой блокировки при списании остатков:
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
// Здесь читаем остатки по складу и записываем движения
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Объектные блокировки из кода ставят ЗаблокироватьДанныеДляРедактирования() и снимают РазблокироватьДанныеДляРедактирования(). Если обработка блокирует элементы в цикле, снимайте блокировку в ветке Исключение тоже — иначе при ошибке объекты останутся заблокированными до конца сеанса.
Частые вопросы
Можно ли удалить одну блокировку, не завершая сеанс?
Почему сеанс фонового задания нельзя просто удалить?
Что делать, если забыт код разрешения?
rac infobase update с --sessions-deny=off. Код для этого не нужен, нужны права администратора базы.Блокировки появились после перехода на PostgreSQL. Это нормально?
VACUUM ANALYZE, и посмотрите долгие транзакции в pg_stat_activity.