Остановка зависшей обработки в 1С 8.3: от Ctrl+Break до завершения сеанса

· 9 мин

Содержание

Прервать обработку в 1С 8.3 штатно можно сочетанием Ctrl+Break (на ноутбуках без Break — Ctrl+Fn+B или Ctrl+Pause) или кнопкой отмены в окне ожидания длительной операции. Если клиент не реагирует, следующий шаг — завершить сеанс в консоли администрирования кластера, а в файловой базе — снять процесс клиента в Диспетчере задач.

Выбор метода зависит от того, где сейчас крутится код: на компьютере пользователя, в рабочем процессе сервера или в фоновом задании. Ниже способы идут от безопасного к радикальному. Это общий механизм платформы, он одинаков для Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и самописных конфигураций.

Сначала определите, что именно зависло

Одна и та же картинка «окно не отвечает» бывает у трёх разных ситуаций. От этого зависит, какой способ сработает.

  • 🖥️ Клиентский код — цикл в модуле формы, обработка выполняется «на клиенте». Обычно помогает Ctrl+Break.
  • 🗄️ Серверный вызов — пользователь нажал кнопку, а тяжёлый запрос или проведение работает на сервере. Клиент ждёт ответа, и клавиши могут не сработать сразу.
  • ⚙️ Фоновое задание — отчёт или групповая операция выполняется в фоне, а форма показывает индикатор ожидания. Остановить можно из формы или из списка фоновых заданий.
СпособКогда применятьЧто теряется
Ctrl+Break, кнопка отменыКлиент реагирует на мышь и клавиатуруТолько незавершённая операция
Список фоновых заданийОтчёт или обработка ушли в фонРезультат этого задания
Отладчик КонфигуратораНужно понять, на какой строке висит кодНичего, если завершить аккуратно
Завершение сеанса в консоли кластераКлиент-серверная база, клиент «замёрз»Несохранённые данные этого сеанса
Диспетчер задачОкно клиента не закрываетсяВсе несохранённые данные пользователя
Перезапуск рабочего процесса или службыСервер перегружен, сеанс не завершаетсяСеансы всех пользователей

Перед любым аварийным способом подождите 3–5 минут и посмотрите загрузку процессора. Тяжёлый отчёт за год по большой базе может честно считаться 10–20 минут. Прерванное проведение придётся запускать заново, и время уйдёт дважды.

Ctrl+Break и кнопки отмены: штатное прерывание обработки

Клавиши

Нажмите Ctrl+Break в окне 1С, где идёт операция. Платформа прервёт выполнение кода и сообщит об этом. Состояние базы останется согласованным: транзакция, которую не успели завершить, откатится целиком.

Если на клавиатуре нет клавиши Break:

  1. Попробуйте Ctrl+Pause — на многих раскладках это одна клавиша.
  2. На ноутбуках — Ctrl+Fn+B или Ctrl+Fn+P, зависит от производителя.
  3. Вызовите экранную клавиатуру Windows (osk.exe), зажмите на ней Ctrl и нажмите Pause.

Почему Ctrl+Break иногда «не работает»

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

Разработчику это лечится одной строкой. В длинных клиентских циклах вызывают метод ОбработкаПрерыванияПользователя() — он проверяет, не нажал ли пользователь Ctrl+Break:

Для Каждого Строка Из ТаблицаДанных Цикл
    ОбработкаПрерыванияПользователя();
    // обработка строки
КонецЦикла;

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

Кнопка отмены в окне ожидания

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

Фоновые задания: прервать обработку, которая ушла в фон

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

  1. Откройте вкладку фоновых заданий.
  2. Отберите задания в состоянии «Выполняется».
  3. Найдите нужное по наименованию и времени начала.
  4. Выделите строку и выполните команду отмены задания в командной панели.

Для самописных решений то же делает код. У объекта фонового задания есть метод Отменить():

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
    Задание.Отменить();
КонецЕсли;

Отмена — это запрос, а не мгновенный «выстрел». Задание остановится, когда платформа дойдёт до точки, где проверяет отмену. Длинный одиночный запрос к СУБД будет доработан до конца.

Прерывание через Конфигуратор и режим отладки

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

Как подключиться

  1. Откройте базу в режиме Конфигуратор.
  2. Запустите пользовательский режим через меню Отладка → Начать отладку (клавиша F5) и воспроизведите зависание.
  3. Если сеанс уже запущен отдельно, откройте Отладка → Подключение и подключите нужный предмет отладки: клиент, серверный сеанс или фоновое задание.

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

Как остановить и посмотреть место

  • ⏸️ Команда Отладка → Прервать останавливает выполнение на текущей строке. Отладчик откроет модуль и подсветит строку, где сейчас работает код.
  • 🔍 Окно стека вызовов покажет, какая процедура какую вызвала. Сразу видно, бесконечный это цикл или просто медленный запрос.
  • ⏹️ Отладка → Завершить отладку (Shift+F5) закрывает отлаживаемый сеанс. Незавершённая транзакция при этом откатится.

Замер производительности

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

Не отлаживайте зависание прямо в рабочей базе в разгар дня. Остановка на точке прерывания держит транзакцию и блокировки — остальные пользователи будут ждать вместе с вами. Снимите копию базы и воспроизведите проблему на ней.

Аварийная остановка 1С через Диспетчер задач

Этот способ — для случая, когда окно 1С не отвечает ни на клавиши, ни на крестик. Всё, что пользователь не записал, пропадёт.

Откройте Диспетчер задач (Ctrl+Shift+Esc), вкладку «Подробности», и найдите процесс клиента:

ПроцессЧто это
1cv8c.exeТонкий клиент
1cv8.exeТолстый клиент и Конфигуратор
1cestart.exeОкно запуска со списком баз
  1. Выделите процесс, который принадлежит зависшей базе. Если открыто несколько окон 1С, ориентируйтесь на столбец ЦП: зависший обычно грузит одно ядро на 100% или, наоборот, стоит на нуле и не отвечает.
  2. Нажмите «Снять задачу».
  3. Запустите 1С заново и проверьте, записался ли последний документ.

Что происходит с сервером после снятия клиента

В клиент-серверном варианте снятие процесса на компьютере пользователя не останавливает серверный вызов. Рабочий процесс сервера rphost.exe может продолжать выполнять запрос, пока не заметит разрыв соединения. Поэтому после Диспетчера задач загляните в консоль кластера: если сеанс висит, завершите его там.

Не снимайте на сервере процессы rphost.exe, rmngr.exe и ragent.exe ради одного пользователя. Завершение rphost.exe обрывает все сеансы, которые обслуживал этот рабочий процесс, а остановка ragent.exe — работу всего сервера 1С. Такие действия допустимы только после предупреждения пользователей и вне рабочего дня.

Завершение сеанса в консоли администрирования серверов 1С

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

Через консоль (MMC)

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

Пользователь получит сообщение о том, что сеанс завершён, а незавершённая транзакция откатится. Если консоль не открывается и пишет об ошибке регистрации, перерегистрируйте radmin.dll из каталога bin нужной версии платформы командой regsvr32 от имени администратора.

Через rac (без графической консоли)

На Linux-сервере или при удалённой работе используйте утилиту rac. Нужен запущенный сервис ras.

rac cluster list
rac session list --cluster=<id-кластера>
rac session terminate --cluster=<id-кластера> --session=<id-сеанса>

Если на кластере задан администратор, добавьте параметры авторизации. Точный список ключей для вашей версии платформы смотрите в rac help session.

Из самой конфигурации

В типовых конфигурациях на БСП есть список «Активные пользователи» в разделе Администрирование. В клиент-серверном режиме оттуда можно завершить выбранный сеанс. Программа попросит пароль администратора кластера, если он задан.

Особенности прерывания в файловой базе

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

Что учесть:

  • 🧭 Если база лежит в сетевой папке, процесс надо снимать на компьютере пользователя, а не на файловом сервере.
  • 🔒 Пока «повисший» клиент жив, другие пользователи могут получать ошибки блокировки при записи. Снятие процесса освобождает файл.
  • 🩺 Аварийное завершение во время записи иногда оставляет файл 1Cv8.1CD с повреждениями. Признаки — ошибки при открытии базы или при формировании отчётов.

Проверка файловой базы после аварийного снятия

  1. Убедитесь, что в базе никто не работает .
  2. Скопируйте каталог базы целиком — это ваша страховка.
  3. Запустите утилиту chdbfl.exe из каталога bin установленной платформы и укажите путь к 1Cv8.1CD.
  4. Сначала выполните проверку без исправления. Если найдены ошибки, повторите с исправлением.

Логическую проверку (Конфигуратор → Администрирование → Тестирование и исправление) запускают после физической: ей нужен монопольный доступ к базе.

Диагностика: выберите симптом

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

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

Частые причины

  • 🔁 Бесконечный цикл в самописной обработке: условие выхода никогда не выполняется. Отладчик сразу покажет одну и ту же строку.
  • 🐢 Запрос в цикле: обращение к базе на каждой строке таблицы вместо одного пакетного запроса.
  • 🔐 Ожидание блокировки: другой пользователь держит транзакцию с теми же данными. Обработка не считает, а ждёт.
  • 📅 Слишком большой период: перепроведение документов за 3 года одним заходом, отчёт без отборов по всей базе.
  • 💾 Нехватка ресурсов: на сервере кончается память, рабочий процесс уходит в своп.

Профилактика

  1. Большие операции разбивайте на порции — перепроведение по месяцам, а не за год сразу.
  2. Тяжёлые обработки запускайте в фоне и вне рабочего времени. Так их легко отменить и они не держат интерфейс.
  3. В своих обработках ставьте ОбработкаПрерыванияПользователя() в длинные клиентские циклы и выводите прогресс.
  4. Для регулярных зависаний включите технологический журнал на сервере и ищите долгие вызовы и ожидания на блокировках.
  5. Перед массовыми изменениями в рабочей базе делайте резервную копию и согласуйте окно работ.

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

Откатятся ли изменения, если прервать обработку?
То, что выполнялось внутри незавершённой транзакции, откатится целиком. Но если обработка записывала документы по одному, без общей транзакции, то уже записанные останутся. Проверьте журнал документов за время работы обработки.
Можно ли прервать обработку другого пользователя, не выходя из своей 1С?
В клиент-серверной базе — да: завершите его сеанс в консоли кластера или в списке активных пользователей. В файловой базе — только на его компьютере.
Что делать, если сеанс в консоли кластера не удаляется?
Подождите, пока рабочий процесс завершит текущий запрос к СУБД. Если сеанс висит долго, крайняя мера — перезапуск рабочего процесса или службы 1С, но это оборвёт сеансы всех пользователей.
Сбивает ли Ctrl+Break лицензию или настройки пользователя?
Нет. Это штатное прерывание кода, сеанс остаётся открытым, лицензия не освобождается и не теряется.
Почему после снятия процесса пишет, что пользователь уже работает в базе?
Сеанс на сервере ещё не закрыт. Удалите его в консоли кластера или подождите, пока сервер сам обнаружит разрыв соединения.