При администрировании распределенных информационных баз (РИБ) одной из регулярных задач становится обновление конфигураций на периферийных узлах. Поскольку этот процесс требует монопольного доступа к базе данных, его обычно планируют на ночное время, когда все пользователи завершили свою работу. Платформа 1С:Предприятие предлагает штатный интерактивный механизм для отложенного обновления конфигурации. Однако системные администраторы и разработчики часто сталкиваются с тем, что в журнале регистрации фиксируется запись: «Ошибка при создании задачи планировщика: 8». При этом на официальном портале Microsoft данному коду соответствует лаконичное описание: «Неизвестная ошибка (Unknown failure)».
В рамках этой статьи мы подробно разберем, почему возникает данная проблема на современных операционных системах, проанализируем исходный программный код, выясним причины неработоспособности старых системных механизмов и рассмотрим современное надежное решение на базе COM-объекта Schedule.Service.
Давайте обратимся к исходному коду, который выполнялся в более ранних версиях типовых конфигураций 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, и задача успешно регистрируется в системе.
Однако на практике это все равно не решает проблему автоматического обновления по следующим причинам:
Win32_ScheduledJob, принудительно запускаются операционной системой под учетной записью NT AUTHORITY\SYSTEM (LocalSystem)."C:\Windows\SysWOW64\wscript.exe //nologo "C:\Users\Администратор.WIN-BTH0734JTJA\AppData\Local\Temp\2\1Cv8Update.190226034117\updater.js". Файл скрипта обновления updater.js расположен в каталоге временных файлов конкретного пользователя (в данном случае Администратора). Учетная запись LocalSystem не имеет доступа к профилям пользователей и их временным папкам, из-за чего скрипт просто не может быть запущен.LocalSystem не сможет подключиться к SQL-серверу, так как у нее отсутствуют сетевые права в домене.Чтобы решить проблему совместимости и обеспечить корректную работу планировщика на современных операционных системах, разработчики фирмы 1С, начиная с версии библиотеки стандартных подсистем (БСП) в релизе «1С:Розница 2.2.8», полностью переписали механизм интеграции.
Вместо устаревшего WMI-класса теперь используется современный COM-объект Schedule.Service, предоставляющий прямой доступ к API Task Scheduler 2.0. Этот интерфейс позволяет создавать полноценные XML-определения задач, гибко настраивать триггеры запуска, указывать конкретного пользователя, от имени которого будет выполняться задача, а также корректно обрабатывать права доступа.
Рассмотрим по шагам, как программно создать задачу в планировщике 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 критически важно правильно настроить параметры учетной записи, от имени которой будет запускаться процесс обновления. Некорректные параметры могут привести к тому, что задача будет создана, но операционная система заблокирует ее выполнение:
Principal.LogonType: Мы передаем значение 3, что соответствует константе TASK_LOGON_SERVICE_ACCOUNT. Это позволяет задаче выполняться в фоновом режиме, даже если указанный пользователь вышел из системы.Principal.RunLevel: Значение 1 (или TASK_RUNLEVEL_HIGHEST) гарантирует, что исполняемый файл будет запущен с правами администратора (без вызова диалогового окна UAC), что необходимо для выполнения системных скриптов обновления и изменения конфигурации баз данных.RegisterTaskDefinition: В качестве параметров этого метода мы передаем имя пользователя и его пароль. Это гарантирует, что задача будет выполняться в контексте безопасности именно этого пользователя, имеющего полные права на папки 1С, каталоги временных файлов и доступ к MS SQL.Даже при использовании корректного кода на базе Schedule.Service, могут возникнуть проблемы, если служба сервера «1С:Предприятие» запущена с недостаточными правами. Проанализируем ключевые рекомендации для системных администраторов:
LocalSystem. Настоятельно рекомендуется создать для службы 1С выделенного локального или доменного пользователя (например, USR1CV8) и предоставить ему права локального администратора на сервере приложений.Применяя данные рекомендации и используя современный COM-объект Schedule.Service вместо устаревших вызовов WMI, вы навсегда избавитесь от ошибки 8 и сможете надежно автоматизировать процессы обновления конфигураций 1С в любое удобное время суток.