Зависла обработка в 1С — как прервать её и разблокировать базу

· 10 мин

Содержание

Если обработка в 1С зависла и база не отвечает, первым делом не закрывайте окно силой — сначала проверьте, не рисует ли программа индикатор выполнения с кнопкой Отмена. Если кнопки нет и клиент повис намертво, порядок такой: аккуратно прервать операцию на клиенте, затем — если это не помогло — найти и снять зависший сеанс со стороны сервера, а в тяжёлых случаях разобраться с блокировкой на уровне СУБД.

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

Сначала прервите операцию на клиенте

Самое безопасное — дать программе остановиться штатно, без завершения процесса.

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

Дождитесь ответа интерфейса. Иногда клиент не завис, а ждёт ответа сервера по долгому запросу. Курсор в виде «песочных часов» и надпись Не отвечает в заголовке окна ещё не означают сбой — дайте 1–2 минуты, особенно если обработка перебирает тысячи строк.

Закройте форму обработки. Если конкретная обработка открыта как отдельная форма и зацикливания нет, попробуйте закрыть её крестиком или Esc. Платформа предложит прервать — соглашайтесь.

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

Крайняя мера на клиенте — снять процесс. Если клиент не реагирует вообще, завершите процесс 1cv8.exe (тонкий/толстый клиент) или 1cv8c.exe (веб-клиент запускается в браузере — там закрывайте вкладку) через Диспетчер задач Windows.

Снятие процесса обрывает операцию на полуслове. Несохранённые данные в открытых формах пропадут. Если обработка писала данные в транзакции — транзакция откатится, база останется целой, но результат работы потеряется. А ещё: сеанс на сервере сразу не исчезнет — он будет висеть, пока кластер не закроет его по тайм-ауту. Поэтому после снятия клиента часто приходится чистить сеанс вручную (следующий раздел).

Как найти, где именно всё встало: отладчик

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

Отладка работает, только когда она разрешена:

  • на стороне сервера — служба агента должна быть запущена с разрешённой отладкой (параметр -debug у службы, задаётся при её настройке);
  • на стороне клиента — в Конфигураторе Сервис → Параметры → Запуск 1С:Предприятия → Отладка.

Порядок подключения:

  1. Откройте Конфигуратор той же базы.
  2. Меню Отладка → Подключение.
  3. В списке предметов отладки выберите нужный сеанс (клиентский сеанс, фоновое задание или серверный вызов) и нажмите Подключить.
  4. Когда сеанс подключён, поставьте выполнение на паузу — вы увидите текущую строку в стеке вызовов.

По стеку сразу видно природу зависания: бесконечный цикл (одна и та же строка крутится), долгий запрос к СУБД (висим на Выбрать() или Записать()) или ожидание блокировки (висим на операции с объектом, который держит другой пользователь).

Отладчик здесь — инструмент диагностики, а не кнопка «стоп». Он показывает, где проблема. Чтобы именно прекратить работу зависшего сеанса, надёжнее снять его через администрирование сервера.

Снятие зависшего сеанса через администрирование сервера

Это основной способ для клиент-серверной базы (вариант «сервер 1С:Предприятия + СУБД»). Сеанс завершается принудительно, клиент у пользователя отваливается с сообщением о разрыве связи.

Клиент обращается к базе через агент сервера (порт 1540), агент — к менеджеру кластера (1541) и рабочим процессам. Управление сеансами идёт через агент, поэтому работают два инструмента: графическая консоль и утилита командной строки rac.

Через консоль администрирования (MMC)

  1. Откройте оснастку Администрирование серверов 1С:Предприятия.
  2. Разверните: сервер → кластер → ваша информационная база → узел Сеансы.
  3. Найдите зависший сеанс по имени пользователя, приложению и колонке активности.
  4. Правой кнопкой по сеансу → Удалить.

Если после удаления сеанса соединение с базой всё ещё держится, загляните в узел Соединения и завершите соответствующее соединение там же.

Через утилиту 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, а анализ: Центр управления производительностью (ЦУП) и технологический журнал показывают, какой именно запрос и на каком объекте создаёт очередь. По этим данным проблема решается не снятием сеанса, а оптимизацией самой обработки.

Выбор инструмента по ситуации:

Где именно зависло — что снимать?

Почему обработка зависает и как это предотвратить

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

Частые причины зависаний:

  • 🔁 Бесконечный цикл или ошибка в коде обработки — выполнение не доходит до конца никогда. Лечится правкой кода, видно по отладчику.
  • 🐢 Тяжёлый запрос без индексов — обработка перебирает большие таблицы построчно. Лечится оптимизацией запроса и регламентным обновлением статистики СУБД.
  • 🔒 Конфликт блокировок — два сеанса ждут данные друг друга (или объект, захваченный долгой транзакцией). Лечится управляемыми блокировками и сокращением длительности транзакций.
  • ⏳ Синхронный длинный расчёт в клиенте — всё считается в одном потоке, интерфейс замирает. Лечится переносом расчёта в фоновое задание.

Что настроить, чтобы зависаний было меньше:

  1. Длительные операции — в фоновое задание. Любой расчёт дольше нескольких секунд выносите в фон через механизм длительных операций БСП — тогда у пользователя появляется корректная кнопка Отмена, а интерфейс не замирает.
  2. Тайм-аут блокировки данных. Разумное значение тайм-аута ожидания блокировки не даёт сеансам висеть в очереди бесконечно — ожидающий получит понятную ошибку вместо вечного зависания.
  3. Регламентное обслуживание СУБД. Обновление статистики и дефрагментация индексов убирают большую часть «беспричинных» тормозов на больших базах.
  4. Разнести тяжёлые регламентные задания по времени. Обмен, закрытие месяца и резервное копирование не должны стартовать одновременно и накладываться на рабочий день.
Перед запуском тяжёлой обработки на рабочей базе
Выполнено: 0 / 5

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

Можно ли остановить обработку, не выгоняя пользователя из базы?
Да, если обработка идёт в фоновом задании — тогда отмена задания не трогает сам сеанс пользователя. Если же обработка выполняется прямо в клиентском сеансе синхронным циклом, прервать её без завершения этого сеанса штатно нельзя.
После снятия процесса `1cv8.exe` сеанс всё равно висит в списке. Это нормально?
Да. Кластер не узнаёт о «снятом» клиенте мгновенно и закрывает такой сеанс по тайм-ауту. Если он мешает прямо сейчас (например, держит монопольную блокировку), удалите его вручную в узле «Сеансы» консоли администрирования.
Безопасно ли удалять файл блокировки `1Cv8.1CD`-базы вручную?
Отдельный файл блокировки файловой базы удалять руками не нужно и рискованно. Закройте все клиенты 1cv8.exe этой базы через Диспетчер задач — блокировка снимется сама.
`KILL` в SQL Server не освобождает базу сразу — почему?
Если снятый процесс успел начать большую транзакцию, СУБД откатывает её, и это может занять время (статус KILLED/ROLLBACK). Дождитесь завершения отката — прерывать его повторным снятием нельзя.
Как понять, завис сеанс или просто долго считает?
Подключитесь отладчиком и посмотрите стек: если строка кода меняется, операция идёт (пусть и медленно); если одна и та же строка крутится или вызов «застыл» на блокировке — это зависание.