Как исправить ошибку создания COM-объекта WinHttp.WinHttpRequest.5.1 в регламентных заданиях 1С?

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

При интеграции веб-сервисов с платформой 1С программисты часто сталкиваются с ситуацией, когда код, успешно работающий в интерактивном сеансе под пользователем, выдает ошибку "Ошибка создания COM-объекта" при запуске в составе регламентного задания. Рассмотрим подробнее, почему это происходит и как обеспечить стабильную работу WinHttp.WinHttpRequest.5.1 и сопутствующих компонентов на стороне сервера.

Проверка состава компонентов при установке сервера 1С

Одной из наиболее неочевидных причин является отсутствие необходимых программных модулей в самой установке платформы 1С:Предприятие. Выясним причину: при инсталляции сервера 1С компонент COM-соединение может быть отключен по умолчанию или пропущен администратором. Если этот модуль не установлен, серверные процессы не смогут корректно инициализировать внешние COM-интерфейсы.

Для решения необходимо запустить программу установки 1С в режиме изменения (Modify) и убедиться, что в дереве компонентов выбран пункт "COM-соединение". После доустановки компонента и перезапуска службы сервера 1С проблема часто исчезает без изменения программного кода.

Проблема разрядности и использование MSScriptControl

Проанализируем ситуацию с разрядностью систем. В современных инфраструктурах сервер 1С чаще всего работает в 64-битной среде (x64), в то время как некоторые COM-объекты, такие как MSScriptControl.ScriptControl, существуют исключительно в 32-битном исполнении. Попытка прямого вызова 32-битного объекта из 64-битного процесса 1С приведет к ошибке.

Если ваша логика требует использования MSScriptControl для настройки WinHttp (например, для обработки специфических заголовков или SSL), необходимо использовать обертку через Службы компонентов (COM+). Разберем по шагам, что нужно сделать:

  1. Создайте новое пустое приложение в консоли "Службы компонентов" (Component Services).
  2. Установите для него способ активации "Библиотечное приложение" или "Серверное приложение" в зависимости от требований к изоляции.
  3. Добавьте в приложение нужные компоненты.
  4. В настройках безопасности созданного приложения убедитесь, что у пользователя, под которым запущена служба сервера 1С (например, USR1CV8), есть права на запуск и активацию.

Инициализация системного профиля (создание папок Desktop)

Регламентные задания выполняются в так называемом "сеансе 0". Это изолированная среда для системных служб, которая не имеет интерактивного рабочего стола. Некоторые COM-объекты при инициализации пытаются обратиться к папкам профиля пользователя, даже если они не выводят визуальных окон. Если этих папок не существует для системной учетной записи, создание объекта WinHttp завершится аварией.

Посмотрим, как решить эту проблему вручную. Вам необходимо создать пустые папки Desktop по следующим путям:

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

Настройка прав доступа в реестре и DCOM

Иногда проблема кроется в безопасности Windows. Учетная запись службы сервера 1С может не иметь прав на чтение веток реестра, где зарегистрированы CLSID компонентов. Проанализируем настройки DCOM:

  1. Запустите dcomcnfg.
  2. Найдите нужный объект (например, параметры WinHTTP или созданную вами обертку).
  3. В свойствах на вкладке "Удостоверение" (Identity) попробуйте явно указать учетную запись администратора для проверки. Если это решит проблему, значит, дело в недостатке прав у системной службы USR1CV8.

Альтернативный подход: Использование нативных объектов 1С

Чтобы избежать сложностей с настройкой DCOM, разрядностью и правами доступа к системным папкам, мы рекомендуем рассмотреть переход на встроенные средства платформы. Объект HTTPСоединение в современных версиях 1С (8.3.x) предоставляет все необходимые инструменты для работы с веб-сайтами, включая поддержку SSL, редиректов и различных методов передачи данных.

Рассмотрим пример кода, который заменяет использование WinHttp на нативные объекты:


// Использование защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Создание соединения
Соединение = Новый HTTPСоединение("example.com", , , , , , Защита);
// Подготовка запроса
Запрос = Новый HTTPЗапрос("/api/data");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
// Получение ответа
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

Использование HTTPСоединение делает код кроссплатформенным и независимым от настроек операционной системы Windows, что особенно критично при переходе на Linux-серверы или при обновлении платформы.

Выбор между WinHttp и ServerXMLHTTP

Если использование COM-объекта все же неизбежно, обратите внимание на разницу между WinHttp.WinHttpRequest.5.1 и MSXML2.ServerXMLHTTP. Объект ServerXMLHTTP специально оптимизирован для работы в многопоточных серверных средах и сеансах без пользовательского интерфейса. Он часто ведет себя стабильнее в регламентных заданиях, так как не имеет зависимостей от настроек прокси-сервера Internet Explorer и более эффективно управляет пулом соединений.

← На главную