Разработка и Конфигурация · 10 мин
Как прервать выполнение кода в 1С
Как прервать выполнение кода в 1С: Ctrl+Break, команда «Остановить», прерывание циклов и процедур, остановка фоновых заданий и зависшего сеанса.
Прервать выполнение кода в 1С приходится в самых разных ситуациях: обработка «зависла» в бесконечном цикле, отчёт строится слишком долго, нужно досрочно выйти из процедуры по условию или остановить фоновое задание, которое блокирует базу. Способ прерывания зависит от того, где выполняется код — на клиенте, на сервере, в отладчике или в фоновом задании.
Важно различать два уровня задачи: аварийную остановку уже запущенного процесса и штатное прерывание, заложенное в сам код конструкциями языка. Первый случай решается горячими клавишами и инструментами администрирования, второй — операторами Возврат, Прервать, Продолжить и исключениями.
Ниже разобраны все рабочие способы: от остановки зависшего сеанса до грамотной организации прерывания циклов в собственных разработках, с указанием ограничений каждого метода.
Как остановить выполняющийся код в клиентском приложении
Когда обработка или отчёт выполняется на клиенте и интерфейс «завис», основной способ — нажать Ctrl+Break (на многих клавиатурах это клавиша Pause/Break). Платформа прервёт исполнение встроенного языка и выведет диалог с предложением остановить обработку. На ноутбуках без отдельной клавиши Break используется сочетание через Fn, например Fn+B или Fn+P — зависит от модели.
Альтернативный путь — меню: Администрирование → Прервать выполнение (в тонком клиенте пункт доступен в главном меню). Этот вариант удобен, если клавиатурное сочетание не срабатывает, что бывает при работе через RDP или в виртуальных машинах, перехватывающих горячие клавиши.
Ограничение метода: прерывание срабатывает только когда управление находится во встроенном языке. Если код «завис» внутри запроса, выполняемого СУБД, или в вызове внешней компоненты, Ctrl+Break не поможет — платформа ждёт ответа от внешнего механизма. В этом случае переходите к способам остановки сеанса, описанным ниже.
Остановка выполнения в конфигураторе и отладчике
В режиме отладки прерывание выполняется кнопкой «Остановить» (Shift+F5) или командой Отладка → Остановить. Отладчик завершает исполнение предмета отладки, при этом сеанс пользователя остаётся активным. Если нужно прервать цикл «на лету» и посмотреть состояние переменных, используйте Отладка → Прервать — выполнение приостановится в текущей точке.
Точки останова с условием позволяют не прерывать код вручную, а останавливаться автоматически: например, остановиться на тысячной итерации цикла или когда переменная примет конкретное значение. Это экономит время при поиске места, где код уходит в бесконечный цикл.
Если отлаживается серверный код или фоновое задание, убедитесь, что в настройках отладки включён пункт «Отладка серверных вызовов» и при необходимости «Останавливаться по ошибке». Без этого остановка произойдёт только на клиентской части кода.
Штатное прерывание кода операторами языка
Для управляемого прерывания внутри собственного кода встроенный язык 1С предоставляет три основных оператора. Возврат завершает выполнение текущей процедуры или функции — для функции обычно с указанием возвращаемого значения. Это стандартный способ досрочного выхода при невыполнении условий.
Прервать выходит из текущего цикла (Для, Для Каждого, Пока) и передаёт управление на оператор, следующий за циклом. Продолжить прерывает текущую итерацию и переходит к следующей. Типичный сценарий — пропуск «плохих» элементов коллекции без остановки всей обработки.
Для прерывания с сигналом об ошибке используется ВызватьИсключение. Исключение поднимается вверх по стеку вызовов до ближайшего блока Попытка...Исключение, а если обработчика нет — завершает выполнение с сообщением пользователю. Это правильный способ остановить цепочку вложенных процедур при критической ошибке.
Для Каждого Строка Из ТаблицаДанных Цикл
Если Не ЗначениеЗаполнено(Строка.Номенклатура) Тогда
Продолжить; // пропускаем пустую строку
КонецЕсли;
Если Строка.Сумма > Лимит Тогда
Прервать; // дальше обрабатывать нельзя
КонецЕсли;
ОбработатьСтроку(Строка);
КонецЦикла;Прерывание длительных операций по требованию пользователя
В длительных циклах, запущенных из формы, хорошая практика — периодически вызывать ОбработкаПрерыванияПользователя(). Этот метод проверяет, нажал ли пользователь Ctrl+Break, и если да — генерирует исключение, позволяя корректно прервать обработку. Без этого вызова в некоторых сценариях нажатие Ctrl+Break игнорируется до конца цикла.
Как остановить фоновое задание и длительную серверную операцию
Фоновые задания выполняются на сервере, поэтому Ctrl+Break на клиенте их не остановит. Штатный способ — открыть обработку «Консоль заданий» (в типовых конфигурациях: Администрирование → Регламентные и фоновые задания), найти активное задание и нажать «Отменить». Задание получит команду отмены и завершится в ближайшей точке, где платформа проверяет отмену.
Программно фоновое задание отменяется методом ФоновоеЗадание.Отменить() после получения объекта задания по уникальному идентификатору. Для длительных операций, запущенных через БСП (ДлительныеОперации), корректнее использовать механизмы библиотеки, которые сами обрабатывают отмену.
Если задание не реагирует на отмену (например, «зависло» в запросе к СУБД), остаётся завершить сеанс через консоль кластера серверов 1С: откройте ветку «Сеансы», найдите сеанс задания и удалите его. В файловом варианте поможет только завершение процесса, что рискованно при активной записи.
Как выбрать действие
Что делать, если прервать не получается
Если все штатные способы исчерпаны, ситуация обычно одна из трёх: запрос выполняется на стороне СУБД, сеанс держит взаимоблокировку, либо зависла сама платформа. В клиент-серверном варианте проверьте активные запросы на SQL Server или PostgreSQL — долгий запрос можно завершить средствами СУБД, после чего сеанс 1С получит ошибку и освободится.
Крайняя мера — завершение процесса rphost (рабочий процесс сервера) или 1cv8.exe (клиент). Делайте это только после попытки корректной остановки и понимая, что незавершённые транзакции откатятся, а в файловой базе возможно повреждение, требующее проверки утилитой chdbfl или тестирования и исправления.
Как проверить, что выполнение действительно прервано
После прерывания убедитесь, что процесс завершился, а не «завис» в полуостановленном состоянии. В клиентском приложении признак успеха — разблокированный интерфейс и отсутствие индикатора длительной операции. Для фоновых заданий проверьте состояние в консоли заданий: оно должно смениться на «Отменено» или «Завершено аварийно».
Дополнительно проверьте журнал регистрации — там фиксируются ошибки, возникшие при прерывании, и сообщения об отмене заданий. Если после остановки в базе остались блокировки, посмотрите список активных сеансов и при необходимости завершите «подвисшие» сеансы.
Как проверить результат
Форма отвечает, индикатор операции исчез
Окно не реагирует, курсор «ожидание» более нескольких минут
Статус «Отменено» или «Завершено»
Задание висит в статусе «Выполняется» после отмены
Есть запись об отмене или ошибке прерывания
Записей нет, сеанс остался активным
Управляемых блокировок от завершённого сеанса нет
Сеанс удалён, но блокировки висят — требуется перезапуск рабочего процесса
Частые вопросы
Почему Ctrl+Break не прерывает выполнение?
Чаще всего потому, что управление находится не во встроенном языке: выполняется запрос на СУБД, вызов внешней компоненты или ожидание ответа сервера. Дождитесь таймаута либо завершите операцию на стороне СУБД или сеанс в консоли кластера.
Чем отличается «Прервать» от «Возврат»?
«Прервать» выходит только из текущего цикла, процедура продолжает выполняться дальше. «Возврат» завершает всю процедуру или функцию целиком, независимо от того, сколько циклов в ней осталось.
Откатятся ли записанные данные при прерывании кода?
Только если запись выполнялась внутри незавершённой транзакции — при исключении она откатится. Данные, записанные с явной фиксацией транзакции до момента прерывания, останутся в базе и потребуют ручной корректировки.
Как прервать цикл по нажатию кнопки в форме?
Напрямую прервать синхронный цикл кнопкой нельзя — интерфейс заблокирован. Вынесите обработку в длительную операцию (фоновое задание) с кнопкой «Отмена», либо вставьте в цикл вызов ОбработкаПрерыванияПользователя() для реакции на Ctrl+Break.
Как остановить зависший сеанс другого пользователя?
Через консоль кластера серверов 1С: откройте список сеансов, найдите нужный по пользователю и времени, удалите его. В файловой базе без сервера потребуется попросить пользователя завершить работу или перезапустить сервер, где лежит база.
Можно ли прервать выполнение запроса?
Штатной команды прерывания запроса во встроенном языке нет. Запрос, ушедший на СУБД, завершится по её таймауту либо его можно «убить» средствами самой СУБД (KILL в MS SQL, pg_terminate_backend в PostgreSQL), после чего 1С получит ошибку.
Что важно запомнить
Клиентский код прерывается через Ctrl+Break, внутри программы — операторами Возврат, Прервать и ВызватьИсключение, фоновые задания — отменой в консоли заданий. Завершение процесса — только крайняя мера, сначала используйте штатные механизмы и проверяйте результат по журналу регистрации и блокировкам.