Как исправить ошибку 8 при программном создании задач планировщика Windows из 1С

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

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

В рамках этой статьи мы подробно разберем, почему возникает данная проблема на современных операционных системах, проанализируем исходный программный код, выясним причины неработоспособности старых системных механизмов и рассмотрим современное надежное решение на базе COM-объекта Schedule.Service.

Почему возникает ошибка при использовании класса Win32_ScheduledJob

Давайте обратимся к исходному коду, который выполнялся в более ранних версиях типовых конфигураций 1С (например, в «1С:Розница» версии 2.2.7). Для работы с планировщиком задач использовался инструментарий управления Windows (WMI), а именно класс Win32_ScheduledJob.

Посмотрим на пример этого кода:


Попытка
    Планировщик = ОбъектWMI().Get("Win32_ScheduledJob");
    КодЗадачи = 0;
    КодОшибки = Планировщик.Create(ИмяФайлаПрограммы, // Command
        ПреобразоватьВремяВФорматCIM(ДатаВремя), // StartTime
        Ложь, // RunRepeatedly
        , // DaysOfWeek
        Pow(2, День(ДатаВремя) - 1), // DaysOfMonth
        Ложь, // InteractWithDesktop
        КодЗадачи); // out JobId
Исключение
    ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании задачи планировщика: %1'"), ОписаниеОшибки());
    ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстСообщения);
    Возврат 0;
КонецПопытки;

Этот алгоритм без проблем работал на старых операционных системах, таких как Windows Server 2008. Однако при попытке запустить его на современных ОС (Windows Server 2012, 2016, 2019, 2022 или Windows 10/11) метод Create стабильно возвращает код ошибки 8.

Выясним причину такого поведения операционной системы. Дело в том, что класс WMI Win32_ScheduledJob под капотом использует устаревший сетевой протокол AT. Этот протокол и управляемая им служба планировщика (команда at.exe) признаны небезопасными. Начиная с Windows 8 и Windows Server 2012, протокол AT по умолчанию полностью отключен на уровне ядра ОС. Поскольку 1С пытается обратиться к заблокированной службе, операционная система прерывает выполнение операции и возвращает ошибку инициализации.

Почему обходные пути через реестр не решают проблему

Существует известный способ принудительно активировать протокол AT в реестре Windows. Для этого в ветке реестра HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\Configuration создается параметр EnableAt типа REG_DWORD со значением 1. После перезагрузки операционной системы метод Create действительно перестает выдавать ошибку 8, и задача успешно регистрируется в системе.

Однако на практике это все равно не решает проблему автоматического обновления по следующим причинам:

  1. Контекст безопасности LocalSystem. Все задачи, создаваемые через устаревший интерфейс Win32_ScheduledJob, принудительно запускаются операционной системой под учетной записью NT AUTHORITY\SYSTEM (LocalSystem).
  2. Ограничение доступа к файловой системе. Команда обновления, генерируемая 1С, часто выглядит следующим образом: "C:\Windows\SysWOW64\wscript.exe //nologo "C:\Users\Администратор.WIN-BTH0734JTJA\AppData\Local\Temp\2\1Cv8Update.190226034117\updater.js". Файл скрипта обновления updater.js расположен в каталоге временных файлов конкретного пользователя (в данном случае Администратора). Учетная запись LocalSystem не имеет доступа к профилям пользователей и их временным папкам, из-за чего скрипт просто не может быть запущен.
  3. Аутентификация в СУБД MS SQL. Если база данных 1С работает в клиент-серверном режиме и настроена на использование авторизации Windows (Windows Authentication), системная учетная запись LocalSystem не сможет подключиться к SQL-серверу, так как у нее отсутствуют сетевые права в домене.

Современное решение: использование интерфейса Schedule.Service

Чтобы решить проблему совместимости и обеспечить корректную работу планировщика на современных операционных системах, разработчики фирмы 1С, начиная с версии библиотеки стандартных подсистем (БСП) в релизе «1С:Розница 2.2.8», полностью переписали механизм интеграции.

Вместо устаревшего WMI-класса теперь используется современный COM-объект Schedule.Service, предоставляющий прямой доступ к API Task Scheduler 2.0. Этот интерфейс позволяет создавать полноценные XML-определения задач, гибко настраивать триггеры запуска, указывать конкретного пользователя, от имени которого будет выполняться задача, а также корректно обрабатывать права доступа.

Реализуем создание задачи через Schedule.Service на языке 1С

Рассмотрим по шагам, как программно создать задачу в планировщике Windows с использованием современного COM-интерфейса. Мы напишем универсальную процедуру, которую вы сможете внедрить в свои доработки или внешние обработки.


Процедура СоздатьЗадачуПланировщика(ИмяЗадачи, ПутьКФайлу, ПараметрыЗапуска, ВремяЗапуска, ИмяПользователяОС, ПарольОС)
    Попытка
        // Инициализируем COM-объект планировщика задач
        Планировщик = Новый COMОбъект("Schedule.Service");
        // Подключаемся к локальному серверу
        Планировщик.Connect();
    Исключение
        ЗаписатьВЖурналРегистрации("Ошибка инициализации Schedule.Service: " + ОписаниеОшибки(), "Ошибка");
        Возврат;
    КонецПопытки;
    
    // Получаем корневую папку планировщика задач
    КорневаяПапка = Планировщик.GetFolder("\");
    
    // Создаем новое определение задачи
    НоваяЗадача = Планировщик.NewTask(0);
    
    // Настраиваем общую информацию о задаче
    НоваяЗадача.RegistrationInfo.Description = "Запуск обновления 1С через планировщик";
    НоваяЗадача.RegistrationInfo.Author = "1C:Предприятие";
    
    // Настраиваем параметры безопасности (Principal)
    НоваяЗадача.Principal.UserId = ИмяПользователяОС;
    НоваяЗадача.Principal.LogonType = 3; // TASK_LOGON_SERVICE_ACCOUNT (фоновый запуск без интерактивного сеанса)
    НоваяЗадача.Principal.RunLevel = 1;  // TASK_RUNLEVEL_HIGHEST (запуск с наивысшими правами администратора)
    
    // Настраиваем параметры выполнения
    НоваяЗадача.Settings.Enabled = Истина;
    НоваяЗадача.Settings.StartWhenAvailable = Истина;
    НоваяЗадача.Settings.Hidden = Ложь;
    
    // Создаем триггер времени (однократный запуск)
    Триггеры = НоваяЗадача.Triggers;
    ТриггерВремени = Триггеры.Create(1); // 1 = TASK_TRIGGER_TIME
    
    // Форматируем время в ISO 8601 (гггг-мм-ддТчч:мм:сс)
    ФорматированноеВремя = Формат(ВремяЗапуска, "ДФ=yyyy-MM-ddТHH:mm:ss");
    ТриггерВремени.StartBoundary = ФорматированноеВремя;
    ТриггерВремени.Enabled = Истина;
    
    // Создаем действие (запуск программы)
    Действия = НоваяЗадача.Actions;
    ДействиеЗапуска = Действия.Create(0); // 0 = TASK_ACTION_EXEC
    ДействиеЗапуска.Path = ПутьКФайлу;
    ДействиеЗапуска.Arguments = ПараметрыЗапуска;
    
    // Регистрируем задачу в планировщике задач
    Попытка
        // 6 = TASK_CREATE_OR_UPDATE
        КорневаяПапка.RegisterTaskDefinition(
            ИмяЗадачи,
            НоваяЗадача,
            6,
            ИмяПользователяОС,
            ПарольОС,
            3
        );
        ЗаписатьВЖурналРегистрации("Задача успешно создана в планировщике Windows", "Информация");
    Исключение
        ЗаписатьВЖурналРегистрации("Ошибка регистрации задачи: " + ОписаниеОшибки(), "Ошибка");
    КонецПопытки;
КонецПроцедуры

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

При работе с COM-объектом Schedule.Service критически важно правильно настроить параметры учетной записи, от имени которой будет запускаться процесс обновления. Некорректные параметры могут привести к тому, что задача будет создана, но операционная система заблокирует ее выполнение:

Рекомендации по настройке прав службы 1С

Даже при использовании корректного кода на базе Schedule.Service, могут возникнуть проблемы, если служба сервера «1С:Предприятие» запущена с недостаточными правами. Проанализируем ключевые рекомендации для системных администраторов:

  1. Смена системной учетной записи службы 1С. По умолчанию сервер 1С часто устанавливается под системной учетной записью LocalSystem. Настоятельно рекомендуется создать для службы 1С выделенного локального или доменного пользователя (например, USR1CV8) и предоставить ему права локального администратора на сервере приложений.
  2. Доступ к сетевым ресурсам. Если база данных расположена на выделенном сервере MS SQL, учетная запись службы 1С должна иметь соответствующие права на чтение и запись в СУБД, а также права на выполнение сетевых запросов.
  3. Права на запись в планировщик задач. Пользователь, от имени которого работает сервер 1С, должен входить в группу «Администраторы» локального компьютера, чтобы иметь техническую возможность программно добавлять новые задачи в планировщик Windows через COM-интерфейс.

Применяя данные рекомендации и используя современный COM-объект Schedule.Service вместо устаревших вызовов WMI, вы навсегда избавитесь от ошибки 8 и сможете надежно автоматизировать процессы обновления конфигураций 1С в любое удобное время суток.

← На главную