При автоматизации регламентных задач в 1С:Предприятие через планировщик заданий Windows часто возникает ситуация, когда после выполнения кода обработки процесс 1cv8.exe не закрывается корректно. Он может «повиснуть» в памяти, блокируя файлы базы данных (в файловом варианте) или занимая лицензию и ресурсы сервера. Разберем по шагам, какие инструменты есть в арсенале администратора и разработчика для решения этой проблемы.
Первым делом проанализируем, как именно завершается работа в коде самой обработки. Обычно используется стандартная процедура ЗавершитьРаботуСистемы(). Однако у нее есть особенности.
Функция ЗавершитьРаботуСистемы(Ложь) инициирует штатное закрытие, при котором система проверяет возможность выхода, вызывает обработчики ПередЗавершениемРаботыСистемы и может выводить интерактивные окна (например, «Завершить работу?»), если они не отключены в настройках пользователя. Если в базе включена защита от опасных действий или существуют модальные окна, процесс может просто остановиться и ждать реакции пользователя, которого нет за монитором.
Более агрессивным методом является использование функции ПрекратитьРаботуСистемы(). В отличие от первого варианта, она закрывает приложение немедленно, не вызывая обработчики событий завершения и не задавая лишних вопросов. Рассмотрим пример вызова:
// В конце логики вашей обработки
Попытка
// Основная логика
ПрекратитьРаботуСистемы();
Исключение
// Запись ошибки в лог
ЗавершитьРаботуСистемы(Ложь);
КонецПопытки;
Если код 1С не срабатывает из-за критической ошибки (краша), управление нужно передать операционной системе. Выясним, как настроить «Планировщик заданий» для контроля времени выполнения.
В свойствах задачи на вкладке «Параметры» (Settings) есть важная опция: «Останавливать задачу, выполняемую дольше...». Если ваша обработка обычно выполняется 5 минут, имеет смысл поставить лимит в 15-20 минут. Если процесс «залипнет», Windows сама попытается его терминировать.
Также полезно активировать флаг «Если выполняемая задача не завершается по требованию, остановить ее принудительно». Это гарантирует, что система применит жесткие методы закрытия дерева процессов, если обычный сигнал завершения проигнорирован.
Иногда даже настройки планировщика не спасают, и в диспетчере задач остаются «зомби-процессы». В этом случае рассмотрим вариант использования системной команды taskkill. Мы можем создать отдельную задачу в планировщике, которая будет запускаться, например, в конце каждого часа или перед следующим запуском основной обработки.
Синтаксис команды для принудительного закрытия всех процессов 1С версии 8:
taskkill /F /IM 1cv8.exe /T
Разберем параметры:
Важно: Будьте осторожны с этой командой, если на этом же сервере работают реальные пользователи под своими сессиями — команда «выбьет» всех без сохранения данных.
Чтобы не «убивать» лишние сессии, проанализируем возможность использования скриптов 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С реже «зависала» на старте или финише, используйте дополнительные ключи командной строки при запуске из планировщика:
/AllowExecuteScheduledJobs -Force — позволяет подавить некоторые интерактивные запросы./DisableStartupMessages — отключает всплывающие сообщения при старте (для новых версий платформы).Посмотрим на пример полной строки запуска:
"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 следует оставить на крайний случай, особенно для файловых информационных баз.