Остановка зависшей обработки, цикла и фонового задания в 1С 8.3

· 9 мин

Содержание

Прервать выполнение в 1С 8.3 проще всего сочетанием Ctrl+Break: платформа спросит, остановить ли операцию, и после подтверждения выбросит исключение. В конфигураторе во время отладки ту же роль играет команда Отладка → Прервать, а из кода остановку дают операторы Прервать, Возврат и ВызватьИсключение.

Если не помогает ни одно из этого, остаётся принудительное завершение: отмена фонового задания, удаление сеанса в консоли кластера или снятие процесса клиента. Методы ниже идут от мягкого к жёсткому.

Клавиши прерывания в режиме 1С:Предприятие

Основная комбинация — Ctrl+Break (на части клавиатур клавиша подписана Pause). Она срабатывает, когда долгий код выполняется на клиенте: цикл в обработке, заполнение табличной части, вывод большого отчёта.

Что происходит после нажатия:

  1. Платформа показывает вопрос, прервать ли выполнение.
  2. Вы подтверждаете — в текущей строке кода возникает исключение.
  3. Если исключение не перехвачено, операция останавливается, на экране появляется сообщение об ошибке.
  4. Открытая транзакция откатывается, ничего «наполовину» не записывается.

На ноутбуке без отдельной клавиши Break попробуйте Ctrl+Fn+B или Ctrl+Fn+Pause — сочетание зависит от производителя. Ещё вариант — экранная клавиатура Windows (osk), в ней есть клавиша Pause.

Почему Ctrl+Break иногда «не слышат»

Клавиши работают не везде. Типичные случаи, когда нажатие ни на что не влияет:

  • 🖥️ код выполняется на сервере (&НаСервере) — длинный запрос или запись тысяч документов. Клиент в это время ждёт ответа и сам прервать серверный вызов не может;
  • 🔁 цикл не содержит ни одной точки, где платформа проверяет прерывание;
  • ⏳ процесс ждёт блокировку данных — он висит не на вашем коде, а в очереди к СУБД;
  • 🪟 окно 1С неактивно: фокус в другой программе, и нажатие уходит туда.

В этих ситуациях спасают способы из разделов про фоновые задания и аварийное завершение.

Отладчик конфигуратора: как остановить код на нужной строке

Разработчику мало просто «убить» операцию — нужно увидеть, где именно она крутится. Для этого в конфигураторе есть меню Отладка.

Порядок действий при зависшем цикле:

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

Если база уже запущена без отладки, подключитесь к ней через Отладка → Подключение: в окне видны предметы отладки — клиентские и серверные сеансы, фоновые задания.

Основные команды отладчика

ДействиеКлавишаКогда использовать
Начать / продолжить отладкуF5Запуск и продолжение после остановки
Точка остановаF9Остановиться на конкретной строке
Шагнуть вF11Зайти внутрь вызываемой процедуры
Шагнуть черезF10Выполнить строку целиком, не заходя внутрь
Шагнуть изShift+F11Дойти до конца текущей процедуры
Идти до курсораShift+F10Пропустить кусок кода до строки с курсором
Вычислить выражениеShift+F9Посмотреть значение переменной или выражения
Завершить отладкуShift+F5Закончить сеанс отладки

Остановка по условию и по ошибке

Когда цикл проходит 50 000 строк, а сбой на 37 412-й, ставить простую точку останова бессмысленно. Выручают два приёма:

  • 🎯 Точка останова с условием — в меню Отладка задаёте выражение, например НомерСтроки = 37412 или Контрагент.ИНН = "7700000000". Отладчик остановится только тогда, когда условие истинно.
  • 🧯 Остановка по ошибке — Отладка → Остановка по ошибке. Отладчик встанет на строке, где возникло исключение, даже если оно потом перехвачено в Попытка … Исключение. Можно отфильтровать по тексту ошибки.

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

Программная остановка: Прервать, Возврат, Отказ и исключения

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

КонструкцияЧто останавливаетТипичный случай
Прервать;Текущий циклНашли нужную строку — дальше искать не нужно
Продолжить;Текущую итерацию циклаПропустить строку с пустым значением
Возврат;Текущую процедуру или функциюПроверка не прошла, дальше выполнять бессмысленно
Отказ = Истина;Запись или проведение объектаПроверка в ПередЗаписью или ОбработкаПроведения
ВызватьИсключениеВсю цепочку вызовов до ближайшей ПопыткаКритическая ошибка, транзакцию нужно откатить

Даём пользователю нажать Ctrl+Break внутри долгого цикла

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

&НаКлиенте
Процедура ОбработатьСтроки(Команда)
    Всего = Объект.Товары.Количество();
    Для Каждого Строка Из Объект.Товары Цикл
        ОбработкаПрерыванияПользователя();
        Строка.Сумма = Строка.Количество * Строка.Цена;
        Состояние("Обработано строк: " + Формат(Строка.НомерСтроки, "ЧГ=0") + " из " + Формат(Всего, "ЧГ=0"));
    КонецЦикла;
КонецПроцедуры

Состояние() выводит прогресс внизу окна — пользователь видит, что программа работает, и реже снимает её через диспетчер задач.

Остановка с понятным текстом через исключение

ВызватьИсключение прерывает не только процедуру, а всю цепочку вызовов. Если внутри была открыта транзакция и исключение не перехвачено, она откатится.

Процедура ЗагрузитьФайл(ПутьКФайлу)
    Файл = Новый Файл(ПутьКФайлу);
    Если Не Файл.Существует() Тогда
        ВызватьИсключение СтрШаблон("Файл не найден: %1", ПутьКФайлу);
    КонецЕсли;
    // загрузка данных
КонецПроцедуры

Попытка
    ЗагрузитьФайл("C:\Обмен\prices.xml");
Исключение
    Текст = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    ЗаписьЖурналаРегистрации("Загрузка прайса", УровеньЖурналаРегистрации.Ошибка, , , Текст);
    Сообщить("Загрузка остановлена: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Не глушите исключения пустым блоком Исключение … КонецПопытки. Код молча продолжит работу с неполными данными, а причину потом не найдёт никто: в журнале регистрации ничего не останется.

Отказ от записи и проведения

В обработчиках событий объекта прерывать через исключение не нужно — для этого есть параметр Отказ. Установили Отказ = Истина — платформа не запишет и не проведёт документ, а пользователь увидит ваши сообщения. Само выполнение обработчика при этом продолжается до конца, поэтому после установки флага, если дальше идут тяжёлые действия, ставьте Возврат.

Как остановить фоновое задание и регламентную операцию

Фоновое задание выполняется на сервере без окна, нажать в нём Ctrl+Break нельзя. Остановить его можно тремя путями.

Из интерфейса типовой конфигурации

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

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

Из кода

У объекта фонового задания есть метод Отменить():

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

Найти все работающие задания можно отбором:

Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
Активные = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из Активные Цикл
    Сообщить(Задание.Наименование + " — " + Задание.ИмяМетода);
КонецЦикла;

После отмены состояние задания станет Отменено, а незавершённая транзакция откатится.

Блокировка всех регламентных заданий базы

Когда нужно остановить все регламентные задания разом (например, перед обновлением), администратор открывает свойства информационной базы в консоли кластера и включает блокировку регламентных заданий. Задания перестанут запускаться по расписанию, пока флаг не снимут.

Аварийная остановка, когда 1С зависла

Если программа не реагирует ни на Ctrl+Break, ни на закрытие окна, действуйте по нарастающей. Перед каждым шагом подождите 2–3 минуты: долгий запрос часто выглядит как зависание, но завершается сам.

Что именно зависло?

Завершение сеанса в консоли кластера

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

Из командной строки то же делает утилита rac: список сеансов выводит rac session list, параметры завершения сеанса смотрите в rac help session.

Удаление сеанса обрывает работу пользователя без сохранения: несохранённые изменения в открытых формах пропадут. Предупредите человека, если он на связи.

Диспетчер задач — последний шаг

Процессы клиента: 1cv8c.exe — тонкий клиент, 1cv8.exe — толстый клиент и конфигуратор. Снятие процесса закрывает окно, но в клиент-серверной базе серверный вызов может продолжать работу ещё какое-то время. Поэтому для серверной базы сначала консоль, потом диспетчер.

Никогда не снимайте процесс rphost.exe на работающем сервере ради одного зависшего пользователя. Рабочий процесс обслуживает десятки сеансов — оборвутся все. Такой шаг допустим только по согласованию и в нерабочее время.

После аварийного снятия файловой базы запустите конфигуратор. Если база не открывается или ведёт себя странно — сделайте копию и выполните Администрирование → Тестирование и исправление в конфигураторе. Режим требует монопольного доступа: все пользователи должны выйти.

Почему выполнение не останавливается и как найти причину

Зависание — симптом. Пока не найдена причина, ситуация повторится завтра в то же время.

Частые источники «вечной» операции:

  • 🔁 бесконечный цикл — Пока без изменения условия, рекурсия без выхода;
  • 🗄️ тяжёлый запрос — отбор по неиндексированному реквизиту, соединение с виртуальной таблицей без параметров, запрос внутри цикла по 10 000 строк;
  • 🔒 ожидание блокировки — другой сеанс держит те же данные. Характерный текст ошибки по таймауту: Превышено максимальное время ожидания предоставления блокировки;
  • 📡 внешний ресурс — обмен с сайтом, ЭДО или банком, который не отвечает, а таймаут в соединении не задан;
  • 💾 нехватка ресурсов — сервер ушёл в своп, диск забит.

Инструменты диагностики

ИнструментЧто покажетГде включается
Замер производительностиКакие строки кода выполняются дольше всегоМеню Отладка конфигуратора
Журнал регистрацииЧто делал пользователь до зависания, ошибкиАдминистрирование в конфигураторе или раздел обслуживания в базе
Технологический журналДлинные запросы, ожидания блокировок, взаимоблокировкиФайл logcfg.xml в каталоге настроек сервера
Консоль кластераКто сейчас грузит сервер и кто держит блокировкуСписок сеансов и соединений базы

Замер производительности — самый быстрый путь для разработчика. Включили, повторили медленное действие, выключили: в отчёте видно, какая строка заняла 90% времени.

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

  • ✅ Длинную обработку запускайте фоновым заданием, а не в клиентском цикле. В БСП для этого есть общий модуль ДлительныеОперации — пользователь видит индикатор и может отменить операцию.
  • ✅ В клиентских циклах вызывайте ОбработкаПрерыванияПользователя() и показывайте прогресс.
  • ✅ Задавайте таймаут в HTTPСоединение и других внешних подключениях.
  • ✅ Выносите запросы из циклов: один пакетный запрос вместо тысячи мелких.
  • ✅ Разносите тяжёлые регламентные задания по времени, чтобы они не пересекались с закрытием месяца.

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

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