Как принудительно завершить работу 1С, если процесс завис после выполнения задачи в планировщике?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации регламентных задач в 1С:Предприятие через планировщик заданий Windows часто возникает ситуация, когда после выполнения кода обработки процесс 1cv8.exe не закрывается корректно. Он может «повиснуть» в памяти, блокируя файлы базы данных (в файловом варианте) или занимая лицензию и ресурсы сервера. Разберем по шагам, какие инструменты есть в арсенале администратора и разработчика для решения этой проблемы.

Использование встроенных функций 1С для выхода

Первым делом проанализируем, как именно завершается работа в коде самой обработки. Обычно используется стандартная процедура ЗавершитьРаботуСистемы(). Однако у нее есть особенности.

Функция ЗавершитьРаботуСистемы(Ложь) инициирует штатное закрытие, при котором система проверяет возможность выхода, вызывает обработчики ПередЗавершениемРаботыСистемы и может выводить интерактивные окна (например, «Завершить работу?»), если они не отключены в настройках пользователя. Если в базе включена защита от опасных действий или существуют модальные окна, процесс может просто остановиться и ждать реакции пользователя, которого нет за монитором.

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


// В конце логики вашей обработки
Попытка
    // Основная логика
    ПрекратитьРаботуСистемы();
Исключение
    // Запись ошибки в лог
    ЗавершитьРаботуСистемы(Ложь);
КонецПопытки;

Настройка планировщика заданий Windows

Если код 1С не срабатывает из-за критической ошибки (краша), управление нужно передать операционной системе. Выясним, как настроить «Планировщик заданий» для контроля времени выполнения.

В свойствах задачи на вкладке «Параметры» (Settings) есть важная опция: «Останавливать задачу, выполняемую дольше...». Если ваша обработка обычно выполняется 5 минут, имеет смысл поставить лимит в 15-20 минут. Если процесс «залипнет», Windows сама попытается его терминировать.

Также полезно активировать флаг «Если выполняемая задача не завершается по требованию, остановить ее принудительно». Это гарантирует, что система применит жесткие методы закрытия дерева процессов, если обычный сигнал завершения проигнорирован.

Применение системной утилиты taskkill

Иногда даже настройки планировщика не спасают, и в диспетчере задач остаются «зомби-процессы». В этом случае рассмотрим вариант использования системной команды taskkill. Мы можем создать отдельную задачу в планировщике, которая будет запускаться, например, в конце каждого часа или перед следующим запуском основной обработки.

Синтаксис команды для принудительного закрытия всех процессов 1С версии 8:

taskkill /F /IM 1cv8.exe /T

Разберем параметры:

Важно: Будьте осторожны с этой командой, если на этом же сервере работают реальные пользователи под своими сессиями — команда «выбьет» всех без сохранения данных.

Умное завершение через PowerShell

Чтобы не «убивать» лишние сессии, проанализируем возможность использования скриптов PowerShell. С их помощью можно закрывать только те процессы, которые отвечают определенным критериям, например, запущены более 2 часов назад или имеют статус «Не отвечает» (Not Responding).

Рассмотрим пример скрипта, который находит процессы 1С, не отвечающие системе:


Get-Process 1cv8 | Where-Object { $_.Responding -eq $false } | Stop-Process -Force

Или скрипт для завершения процессов, время жизни которых превысило допустимый предел:


$limit = (Get-Date).AddHours(-2)
Get-Process 1cv8 | Where-Object { $_.StartTime -lt $limit } | Stop-Process -Force

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

Проанализируем ситуацию с файловым режимом работы. Принудительное завершение процесса 1cv8.exe (особенно через taskkill или «убийство» процесса в диспетчере задач) крайне не рекомендуется для файловых баз (.1CD). Это может привести к повреждению внутренней структуры таблиц, после чего потребуется запуск утилиты chdbfl.exe или полное восстановление из бэкапа.

Если вы вынуждены использовать принудительное завершение в файловом режиме, убедитесь, что:

  1. Вы используете ПрекратитьРаботуСистемы() в коде как основной метод.
  2. Перед выходом программно отключаются все фоновые задания этой сессии.
  3. В настройках пользователя, под которым запускается планировщик, сняты все флаги подтверждения выхода.

Параметры запуска для минимизации зависаний

Чтобы 1С реже «зависала» на старте или финише, используйте дополнительные ключи командной строки при запуске из планировщика:

Посмотрим на пример полной строки запуска:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\Bases\MyBase" /N "SchedulerUser" /P "Password" /Execute "C:\Scripts\MyLogic.epf" /AllowExecuteScheduledJobs -Force

Заключение

Для надежной работы автоматизации рекомендуется комбинировать методы: использовать ПрекратитьРаботуСистемы() внутри кода для штатного быстрого выхода и настраивать таймауты в Планировщике Windows как страховку. Использование taskkill следует оставить на крайний случай, особенно для файловых информационных баз.

← На главную