Остановка зависшей обработки, отчёта или кода в 1С: что делать пользователю и разработчику

· 9 мин

Содержание

Чтобы прервать процедуру в 1С 8.3, нажмите Ctrl+Break и подтвердите остановку, а если на экране окно длительной операции — кнопку «Отмена». Это безопасные способы: платформа останавливает код в контрольной точке и откатывает незавершённую транзакцию. Снимать процесс через Диспетчер задач стоит только тогда, когда программа не отвечает совсем.

Риски зависят от того, где выполняется код. Отчёт можно оборвать без последствий. Групповое перепроведение или закрытие месяца , оборванные на середине, оставят базу в промежуточном состоянии: часть документов уже обработана, часть нет. Поэтому начинайте с мягких способов и переходите к жёстким, только если первые не сработали.

Как прервать выполнение процедуры обычному пользователю

У пользователя три штатных инструмента. Их хватает в большинстве ситуаций, когда 1С «задумалась» над отчётом или обработкой.

Сочетание Ctrl+Break

  1. Убедитесь, что окно 1С активно: щёлкните по его заголовку.
  2. Нажмите Ctrl+Break. На ноутбуках без клавиши Break обычно работает Ctrl+Fn+B или Ctrl+Fn+Pause — зависит от производителя.
  3. Платформа спросит, прервать ли выполнение. Ответьте «Да».
  4. Дождитесь сообщения о прерывании и закройте его.

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

Кнопка «Отмена» в окне ожидания

Современные типовые конфигурации (БП 3.0, ЗУП 3.1, УТ 11) запускают долгие действия как фоновые задания. Пользователь видит окно с индикатором и кнопкой «Отмена». Нажатие отменяет фоновое задание на сервере, а не просто закрывает окно.

Если закрыть окно ожидания крестиком, а не кнопкой «Отмена», задание может продолжить работу на сервере. Проверяйте результат по списку фоновых заданий (о нём ниже).

Закрыть отчёт или форму

Формирование отчёта иногда останавливается закрытием его формы. Это работает, если отчёт строится в фоне. Если интерфейс уже не реагирует на клики, закрыть форму не получится — переходите к Ctrl+Break.

СпособКогда подходитРиск для данных
Ctrl+Breakкод выполняется на клиенте или идёт обычный серверный вызовнизкий: транзакция откатывается
«Отмена» в окне ожиданиядлительная операция в фоненизкий
Закрытие формы отчётаотчёт формируется в фоненет
Диспетчер задачпрограмма не отвечает совсемсредний, в файловой базе — выше
Завершение сеанса в консоли кластераклиент закрыт, а сеанс виситсредний

Отмена длительных операций и фоновых заданий

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

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

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

Отмена так же мягкая, как Ctrl+Break: платформа останавливает код задания, текущая транзакция откатывается. Всё, что задание успело записать в предыдущих транзакциях, остаётся в базе.

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

Программные способы прервать процедуру в коде

Разработчику доступно больше рычагов. Их задача не «убить» процесс, а завершить его предсказуемо.

Выход из цикла и процедуры

  • 🔁 Прервать — немедленно выходит из текущего цикла Для или Пока.
  • ⏭️ Продолжить — переходит к следующей итерации, пропуская остаток тела цикла.
  • ↩️ Возврат — выходит из процедуры или функции. В функции после него указывают значение.
  • ⛔ ВызватьИсключение — прерывает выполнение с ошибкой. Если код в транзакции, её надо откатить в блоке Исключение.

Отказ в обработчиках событий

В обработчиках ПередЗаписью, ОбработкаПроведения, ОбработкаПроверкиЗаполнения и других есть параметр Отказ. Присвойте ему Истина, и платформа не запишет объект. Это правильный способ остановить запись документа, когда данные не прошли проверку.

Разрешить пользователю прерывать долгий цикл

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

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

Отмена фонового задания из кода

Для серверных операций правильнее запустить фоновое задание и дать пользователю кнопку отмены. Объект фонового задания имеет метод Отменить(). Найти задание можно через ФоновыеЗадания.НайтиПоУникальномуИдентификатору().

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

В конфигурациях на БСП то же самое делает общий модуль ДлительныеОперации: он запускает задание, показывает окно ожидания и обрабатывает отмену. Свой механизм поверх него писать не нужно.

Найти, где процедура зависла

Когда код уходит в бесконечный цикл, подключитесь к сеансу отладчиком из Конфигуратора и выполните Отладка → Прервать. Выполнение остановится на текущей строке, и в стеке вызовов будет видно, какая процедура крутится. Для клиент-серверной базы отладка на сервере должна быть разрешена заранее.

Зависание без реакции: Диспетчер задач и консоль кластера

Если окно 1С помечено «Не отвечает», Ctrl+Break уже не поможет. Остаётся снять процесс.

Какой процесс завершать

ПроцессЧто это
1cv8c.exeтонкий клиент (управляемые формы)
1cv8.exeтолстый клиент или Конфигуратор
rphost.exeрабочий процесс сервера 1С, в нём сеансы многих пользователей
ragent.exe, rmngr.exeагент и менеджер кластера

Пользователю завершать можно только свой клиентский процесс:

  1. Откройте Диспетчер задач (Ctrl+Shift+Esc).
  2. На вкладке «Подробности» найдите 1cv8c.exe или 1cv8.exe.
  3. На терминальном сервере включите колонку «Имя пользователя» и снимайте только процесс со своим именем.
  4. Нажмите «Снять задачу».

Из командной строки то же делает taskkill с номером процесса — так вы не заденете чужие сеансы:

tasklist /FI "IMAGENAME eq 1cv8c.exe"
taskkill /PID 12345 /F

Команда taskkill /IM 1cv8c.exe /F на терминальном сервере закроет 1С у всех пользователей сразу. Используйте её только на своём компьютере.

Почему после закрытия клиента база всё ещё занята

В клиент-серверном варианте код серверного вызова выполняет rphost.exe. Если снять клиент, серверная часть может ещё какое-то время работать и держать блокировки. Администратор находит такой сеанс в консоли администрирования серверов 1С: Кластер → Информационные базы → <база> → Сеансы.

Варианты действий администратора по нарастающей:

  1. Прервать текущий серверный вызов сеанса — в актуальных версиях платформы в консоли есть такая команда, сам сеанс при этом остаётся.
  2. Удалить сеанс — пользователь потеряет несохранённые данные.
  3. Перезапустить рабочий процесс rphost.exe — крайняя мера.

Завершение rphost.exe или перезапуск службы агента сервера оборвёт сеансы всех пользователей этого процесса. Делайте это после предупреждения коллег, в обед или вечером. Из командной строки сеансы смотрят через rac session list, состав команд для своей версии — в rac help session.

Обычные и управляемые формы: в чём разница при прерывании

В толстом клиенте с обычными формами почти весь код обработки выполняется на компьютере пользователя. Ctrl+Break обрабатывается там же, поэтому реакция обычно быстрая. Минус: если процесс завис, вместе с ним «висит» всё окно программы.

В управляемых формах код делится на клиентский и серверный. Пока идёт серверный вызов, клиент ждёт ответа. Прерывание передаётся на сервер и срабатывает, когда серверный код дойдёт до точки проверки. Долгий запрос к СУБД может не реагировать до своего завершения.

Поэтому в управляемом приложении разработчики выносят тяжёлые действия в фоновые задания. Интерфейс остаётся живым, а у пользователя есть кнопка «Отмена». Если вы пишете свою обработку и видите, что серверный вызов идёт дольше 10–20 секунд, это сигнал перевести его в фон.

Обычные формыУправляемые формы
Где выполняется кодв основном на клиентеклиент + сервер
Реакция на Ctrl+Breakбыстраяпосле выхода из тяжёлого запроса
Типовой способ отменыCtrl+Break«Отмена» в окне длительной операции
Что снимать при зависании1cv8.exe1cv8c.exe, затем проверить сеанс

Режимы запуска: файловая база, сервер, веб-клиент, Конфигуратор

Одно и то же действие в разных режимах приводит к разным последствиям.

  • 📁 Файловая база. Клиент работает с файлом 1Cv8.1CD напрямую. Снятие процесса во время записи — самый рискованный сценарий: возможны ошибки структуры файла. После такой остановки проверьте базу.
  • 🖥️ Клиент-серверная база . Данные пишет СУБД, транзакции откатываются на её стороне. Целостность файла не страдает, но могут остаться повисший сеанс и блокировки.
  • 🌐 Веб-клиент. Закрытие вкладки браузера не останавливает серверный вызов мгновенно. Сеанс завершится по таймауту или его удаляет администратор.
  • 🛠️ Конфигуратор. Обновление конфигурации базы данных, загрузку .dt и тестирование прерывать нельзя: база может остаться в неработоспособном состоянии. Ждите окончания, даже если прогресс стоит на месте десятки минут.

Обрыв операции «Обновить конфигурацию базы данных» или загрузки .dt лечится только восстановлением из резервной копии. Перед такими операциями копия обязательна.

Последствия неправильного прерывания и как их устранить

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

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

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

  1. Убедитесь, что в базе никто не работает, и скопируйте весь каталог базы.
  2. Откройте базу в Конфигураторе: Администрирование → Тестирование и исправление.
  3. Сначала отметьте только проверку логической целостности, без исправлений, и посмотрите отчёт.
  4. Если ошибки есть — запускайте исправление на копии.

Если база не открывается даже в Конфигураторе, файл проверяют утилитой chdbfl.exe из папки bin установленной платформы. Утилита работает только при закрытой базе.

Как не доводить до экстренной остановки

Большинство прерываний — следствие того, что операцию запустили не в то время или не с теми настройками.

  • 📅 Ограничивайте период. Отчёт за пять лет по всем контрагентам строится долго. Сначала проверьте месяц.
  • 🌙 Тяжёлое — в нерабочее время. Перепроведение за год, свёртку, пересчёт итогов запускайте вечером, когда нет конкурирующих блокировок.
  • 💾 Копия перед массовыми операциями. Тогда прерывание ничего не стоит: вернулись к копии и начали заново.
  • ⏱️ Замерьте время на малом объёме. Месяц перепровёлся за 4 минуты — год займёт около 50 минут. Значит, ждать час нормально, и паниковать на 15-й минуте рано.
  • 🧪 Новые обработки — сначала в копии базы. Бесконечный цикл в рабочей базе дороже, чем в тестовой.
  • 🔧 Разработчикам: ставьте ОбработкаПрерыванияПользователя() в длинные клиентские циклы, тяжёлое выносите в фоновые задания, показывайте прогресс.
Перед запуском долгой операции
Выполнено: 0 / 5

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

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