Зависла обработка в 1С — как прервать её и разблокировать базу
Содержание
Если обработка в 1С зависла и база не отвечает, первым делом не закрывайте окно силой — сначала проверьте, не рисует ли программа индикатор выполнения с кнопкой Отмена. Если кнопки нет и клиент повис намертво, порядок такой: аккуратно прервать операцию на клиенте, затем — если это не помогло — найти и снять зависший сеанс со стороны сервера, а в тяжёлых случаях разобраться с блокировкой на уровне СУБД.
Какой способ применять — зависит от того, где именно всё встало: в одном клиентском сеансе, в фоновом задании или в базе данных целиком. Ниже — по порядку, от самого безопасного метода к радикальным, с точными путями и командами.
Сначала прервите операцию на клиенте
Самое безопасное — дать программе остановиться штатно, без завершения процесса.
Проверьте индикатор выполнения. Длительные операции, написанные по уму, показывают окно прогресса с кнопкой Отмена или Прервать. Нажатие ставит флаг отмены — код сам корректно завершит транзакцию. Это предпочтительный путь: ничего не рвётся на полуслове.
Дождитесь ответа интерфейса. Иногда клиент не завис, а ждёт ответа сервера по долгому запросу. Курсор в виде «песочных часов» и надпись Не отвечает в заголовке окна ещё не означают сбой — дайте 1–2 минуты, особенно если обработка перебирает тысячи строк.
Закройте форму обработки. Если конкретная обработка открыта как отдельная форма и зацикливания нет, попробуйте закрыть её крестиком или Esc. Платформа предложит прервать — соглашайтесь.
У кода, запускающего долгие расчёты через фоновое задание (механизм длительных операций), всегда есть отмена. Если её нет — обработка написана «в лоб», синхронным циклом, и прервать её на клиенте штатно не получится. Тогда переходите к следующим разделам.
Крайняя мера на клиенте — снять процесс. Если клиент не реагирует вообще, завершите процесс 1cv8.exe (тонкий/толстый клиент) или 1cv8c.exe (веб-клиент запускается в браузере — там закрывайте вкладку) через Диспетчер задач Windows.
Снятие процесса обрывает операцию на полуслове. Несохранённые данные в открытых формах пропадут. Если обработка писала данные в транзакции — транзакция откатится, база останется целой, но результат работы потеряется. А ещё: сеанс на сервере сразу не исчезнет — он будет висеть, пока кластер не закроет его по тайм-ауту. Поэтому после снятия клиента часто приходится чистить сеанс вручную (следующий раздел).
Как найти, где именно всё встало: отладчик
Если обработка регулярно зависает в одном и том же месте, не гадайте — подключите отладчик и посмотрите, на какой строке кода выполнение застревает.
Отладка работает, только когда она разрешена:
- на стороне сервера — служба агента должна быть запущена с разрешённой отладкой (параметр
-debugу службы, задаётся при её настройке); - на стороне клиента — в Конфигураторе
Сервис → Параметры → Запуск 1С:Предприятия → Отладка.
Порядок подключения:
- Откройте Конфигуратор той же базы.
- Меню
Отладка → Подключение. - В списке предметов отладки выберите нужный сеанс (клиентский сеанс, фоновое задание или серверный вызов) и нажмите Подключить.
- Когда сеанс подключён, поставьте выполнение на паузу — вы увидите текущую строку в стеке вызовов.
По стеку сразу видно природу зависания: бесконечный цикл (одна и та же строка крутится), долгий запрос к СУБД (висим на Выбрать() или Записать()) или ожидание блокировки (висим на операции с объектом, который держит другой пользователь).
Отладчик здесь — инструмент диагностики, а не кнопка «стоп». Он показывает, где проблема. Чтобы именно прекратить работу зависшего сеанса, надёжнее снять его через администрирование сервера.
Снятие зависшего сеанса через администрирование сервера
Это основной способ для клиент-серверной базы (вариант «сервер 1С:Предприятия + СУБД»). Сеанс завершается принудительно, клиент у пользователя отваливается с сообщением о разрыве связи.
Клиент обращается к базе через агент сервера (порт 1540), агент — к менеджеру кластера (1541) и рабочим процессам. Управление сеансами идёт через агент, поэтому работают два инструмента: графическая консоль и утилита командной строки rac.
Через консоль администрирования (MMC)
- Откройте оснастку Администрирование серверов 1С:Предприятия.
- Разверните: сервер → кластер → ваша информационная база → узел Сеансы.
- Найдите зависший сеанс по имени пользователя, приложению и колонке активности.
- Правой кнопкой по сеансу → Удалить.
Если после удаления сеанса соединение с базой всё ещё держится, загляните в узел Соединения и завершите соответствующее соединение там же.
Через утилиту rac (командная строка)
Когда консоли под рукой нет или сервер на Linux, тот же результат даёт rac:
# узнать идентификатор кластера
rac cluster list
# список сеансов в кластере
rac session list --cluster=<cluster-uuid>
# завершить конкретный сеанс по его идентификатору
rac session terminate --session=<session-uuid> --cluster=<cluster-uuid>
Если у кластера или базы заданы администраторы, добавьте параметры аутентификации (--cluster-user, --cluster-pwd и аналогичные для базы). Точный набор параметров зависит от версии платформы — сверяйтесь со справкой rac help и rac session help, не придумывайте ключи наугад.
Снятие сеанса — это аварийное прекращение работы пользователя. Он потеряет несохранённые данные текущей формы. Делайте это, когда сеанс действительно завис, а не просто долго считает, и по возможности предупредите человека.
Как отличить зависший сеанс от работающего. В списке сеансов смотрите на колонку с последней активностью и на объём захваченных данных. Если активность не менялась несколько минут, а соединение числится активным — сеанс завис. Если цифры по памяти и вызовам СУБД растут — операция идёт, просто медленно; такой сеанс лучше не трогать.
Чтобы остановить сразу всех — блокируйте новые сеансы. Когда нужно не снять один зависший сеанс, а корректно освободить базу целиком (перед обновлением или тяжёлым регламентом), не выгоняйте людей по одному. В свойствах информационной базы в консоли администрирования включите блокировку начала сеансов, задайте текст сообщения и код разрешения. Новые подключения перестанут проходить, а работающие пользователи спокойно закончат и выйдут. Код разрешения позволит вам самому зайти в закрытую базу для работ.
Блокировку начала сеансов не забывайте снимать после работ — иначе пользователи утром не смогут войти и получат ваше служебное сообщение.
Таблица: чем снимать в зависимости от варианта базы.
| Вариант базы | Чем снимать сеанс |
|---|---|
| Клиент-серверный (сервер 1С + СУБД) | Консоль администрирования или rac |
| Файловый (общая папка) | Сеанса на сервере нет — только закрыть/снять клиент |
В файловой базе нет сервера, который хранит сеансы. Там зависший клиент снимается только через Диспетчер задач, а если файловая база заблокирована упавшим клиентом — после снятия всех 1cv8.exe блокировка отпускается сама. Вручную удалять служебные файлы блокировки из каталога базы не нужно.
Что делать с зависшим фоновым или регламентным заданием
Длинные операции (проведение документов пачкой, обмен, закрытие месяца ) часто идут не в клиенте, а в фоновом задании. Зависло именно оно — снимать клиент бесполезно.
Из пользовательского режима. В типовых конфигурациях на БСП есть отдельное рабочее место. Путь в 1С:Бухгалтерии 3.0 и ЗУП 3.1:
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания
На закладке Фоновые задания найдите выполняющееся задание (статус Выполняется) и нажмите команду отмены в командной панели списка. Регламентное задание, которое зацикливается при каждом запуске, можно временно выключить на закладке Регламентные задания — снять флажок Включено.
Если конкретного пункта меню не видно, он может быть скрыт по правам. Полный доступ к этому рабочему месту есть у пользователя с профилем администратора.
Со стороны сервера. Фоновое задание — это тоже сеанс (с приложением BackgroundJob). Его видно в узле Сеансы консоли администрирования и в rac session list. Снимается так же, как обычный сеанс.
Прежде чем обрывать фоновое задание, убедитесь, что это не регламентное обновление или обмен в середине транзакции. Прерванный обмен данными придётся запускать заново; прерванное групповое проведение оставит часть документов проведёнными, часть — нет.
Когда зависание держится на уровне СУБД
Если сеанс 1С снят, а база всё равно «тормозит для всех», причина обычно в блокировке на уровне СУБД: один тяжёлый запрос держит таблицу, остальные ждут его в очереди.
Сначала посмотрите, кто кого блокирует.
PostgreSQL — активные процессы и ожидания:
SELECT pid, state, wait_event_type, query
FROM pg_stat_activity
WHERE datname = 'имя_базы';
Завершить зависший процесс по его pid:
SELECT pg_terminate_backend(12345);
Microsoft SQL Server — кто блокирует и кого:
EXEC sp_who2;
Колонка BlkBy показывает блокирующий сеанс. Снять процесс по его идентификатору (SPID):
KILL 57;
Снятие процесса в СУБД — самая грубая мера. Делайте это только если сеанс уже снят на стороне 1С, а блокировка осталась. Обрыв процесса на уровне базы данных может привести к откату крупной транзакции (СУБД будет долго откатывать её), а 1С получит ошибку соединения. Никогда не завершайте служебные процессы самой СУБД — только пользовательские соединения к вашей базе.
Для разбора сложных блокировок в проде удобнее не ручной KILL, а анализ: Центр управления производительностью (ЦУП) и технологический журнал показывают, какой именно запрос и на каком объекте создаёт очередь. По этим данным проблема решается не снятием сеанса, а оптимизацией самой обработки.
Выбор инструмента по ситуации:
Почему обработка зависает и как это предотвратить
Разовое снятие сеанса — лечение симптома. Если обработка виснет регулярно, причина в коде или настройках, и её стоит убрать.
Частые причины зависаний:
- 🔁 Бесконечный цикл или ошибка в коде обработки — выполнение не доходит до конца никогда. Лечится правкой кода, видно по отладчику.
- 🐢 Тяжёлый запрос без индексов — обработка перебирает большие таблицы построчно. Лечится оптимизацией запроса и регламентным обновлением статистики СУБД.
- 🔒 Конфликт блокировок — два сеанса ждут данные друг друга (или объект, захваченный долгой транзакцией). Лечится управляемыми блокировками и сокращением длительности транзакций.
- ⏳ Синхронный длинный расчёт в клиенте — всё считается в одном потоке, интерфейс замирает. Лечится переносом расчёта в фоновое задание.
Что настроить, чтобы зависаний было меньше:
- Длительные операции — в фоновое задание. Любой расчёт дольше нескольких секунд выносите в фон через механизм длительных операций БСП — тогда у пользователя появляется корректная кнопка Отмена, а интерфейс не замирает.
- Тайм-аут блокировки данных. Разумное значение тайм-аута ожидания блокировки не даёт сеансам висеть в очереди бесконечно — ожидающий получит понятную ошибку вместо вечного зависания.
- Регламентное обслуживание СУБД. Обновление статистики и дефрагментация индексов убирают большую часть «беспричинных» тормозов на больших базах.
- Разнести тяжёлые регламентные задания по времени. Обмен, закрытие месяца и резервное копирование не должны стартовать одновременно и накладываться на рабочий день.
Частые вопросы
Можно ли остановить обработку, не выгоняя пользователя из базы?
После снятия процесса `1cv8.exe` сеанс всё равно висит в списке. Это нормально?
Безопасно ли удалять файл блокировки `1Cv8.1CD`-базы вручную?
1cv8.exe этой базы через Диспетчер задач — блокировка снимется сама.`KILL` в SQL Server не освобождает базу сразу — почему?
KILLED/ROLLBACK). Дождитесь завершения отката — прерывать его повторным снятием нельзя.