Ситуация, когда запуск 1С через bat-файл отлично работает вручную, но намертво «зависает» при старте через планировщик заданий Windows (Task Scheduler), является классической проблемой для системных администраторов и разработчиков 1С. Основная сложность заключается в том, что в фоновом режиме (Session 0) система ведет себя иначе, чем в интерактивном сеансе пользователя. Проанализируем причины этой проблемы и разберем пошаговое решение.
Когда вы запускаете задание в планировщике с опцией «Выполнять для всех пользователей» (независимо от того, вошел пользователь в систему или нет), Windows создает неинтерактивную сессию. В этой сессии отсутствуют графический интерфейс и многие привычные пути к папкам профиля. Если 1С или внешняя компонента (DLL), которую она вызывает, пытается создать окно, вывести сообщение или обратиться к рабочему столу, процесс переходит в режим бесконечного ожидания ответа от пользователя, которого нет у монитора. Рассмотрим подробнее, как это исправить.
Это самое неочевидное, но наиболее частое решение. Многие COM-объекты и библиотеки (DLL), включая компоненты для обмена данными, требуют наличия папки Desktop в системном профиле для инициализации своего окружения, даже если они не выводят графику. Выясним, как их создать:
C:\Windows\SysWOW64\config\systemprofileC:\Windows\System32\config\systemprofile и создадим там аналогичную папку Desktop.Важно: Это решение часто исправляет ошибки при работе с компонентами от «Далион», драйверами торгового оборудования и другими внешними библиотеками.
Чтобы понять, где именно останавливается выполнение, необходимо видеть технический вывод 1С. В планировщике мы не видим консоль, поэтому воспользуемся ключом /Out. Модифицируем строку запуска в нашем bat-файле:
@echo off
"C:\Program Files (x86)\1cv8\8.3.12.1529\bin\1cv8.exe" ENTERPRISE /F"C:\1CBase\Test\TRAKTIR_TEST3\" /N"Obmen" /P"****" /Execute"C:\1CBase\Test\TRAKTIR_TEST3\Test.epf" /Out"C:\1CBase\log.txt" /DisableStartupMessages
Проанализируем параметры:
/Out"путь_к_файлу" — записывает все сообщения системы и ошибки в текстовый файл./DisableStartupMessages — подавляет стартовые диалоговые окна (например, о подтверждении обновления), которые могут блокировать работу в фоне.Как было выяснено в ходе обсуждения, зависание часто происходит на строке загрузки внешней компоненты. Например:
ЗагрузитьВнешнююКомпоненту(ИмяКомпонентыDalion);
В неинтерактивной сессии выполнение этой команды может вызвать сбой, если компонента не зарегистрирована в системе или пытается обратиться к ресурсам, доступным только при наличии загруженного профиля пользователя. Рассмотрим варианты исправления:
ЗагрузитьВнешнююКомпоненту() на ПодключитьВнешнююКомпоненту(). Второй метод более современный и часто работает стабильнее в фоновых заданиях.regsvr32.Иногда командный интерпретатор cmd.exe сам по себе создает проблемы с передачей кавычек или ожиданием завершения процесса. Попробуем использовать VBScript для более «чистого» запуска процесса 1С. Создадим файл start_1c.vbs:
Set WshShell = CreateObject("WScript.Shell")
' Команда запуска с тройными кавычками для путей с пробелами
Command = """C:\Program Files (x86)\1cv8\8.3.12.1529\bin\1cv8.exe"" ENTERPRISE /F""C:\1CBase\Test\TRAKTIR_TEST3\"" /N""Obmen"" /P""****"" /Execute""C:\1CBase\Test\TRAKTIR_TEST3\Test.epf"""
' 0 - запустить в скрытом режиме, True - ждать завершения
WshShell.Run Command, 0, True
В планировщике задач в качестве исполняемого файла укажем wscript.exe, а в качестве аргумента — путь к вашему .vbs файлу.
Если ваша обработка запускается в «Обычном приложении», 1С все равно инициализирует форму. Посмотрим на настройки формы:
ПриОткрытии прописан отказ от открытия или завершение работы, чтобы сессия не висела после выполнения задачи.Пример корректного завершения в коде обработки:
Процедура ПриОткрытии()
Попытка
// Ваш код логики обмена
ВыполнитьОбмен();
ЗаписьЖурналаРегистрации("ОбменЗавершен", УровеньЖурналаРегистрации.Информация);
Исключение
ЗаписьЖурналаРегистрации("ОшибкаОбмена", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
// Принудительное завершение работы системы
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Проанализируем итоговый список действий, если 1С все еще висит в процессах:
bin установленной платформы 1С.Используя эти методы, мы сможем добиться стабильной работы автоматических обработок в фоновом режиме, исключив влияние ограничений сессии Session 0.