Как настроить COM-соединение к другому серверу для работы с компонентой ЭТРАН в 1С?

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

При интеграции систем 1С:Предприятие со сторонними внешними сервисами разработчики часто сталкиваются с необходимостью использования COM-компонентов. Классическим примером такой интеграции является взаимодействие с автоматизированной системой централизованной подготовки и оформления перевозочных документов (АС ЭТРАН) ОАО «РЖД» с использованием библиотеки EtranASUGO.dll.

Типичная проблема возникает в распределенной серверной инфраструктуре. Предположим, у нас есть два сервера: DB-01 (на нем развернут сервер 1С, настроен защищенный канал VipNet и установлена компонента ЭТРАН) и DB-02 (дополнительный сервер 1С, на котором выполняются регламентные задания). Когда регламентное задание запускается на сервере DB-02 и пытается инициализировать объект EtranASUGO.EtranASUGO на сервере DB-01, система выдает ошибку: «Класс не зарегистрирован» или «Интерфейс не поддерживается». Выясним причины такого поведения платформы и разберем по шагам три альтернативных способа решения этой проблемы.

Почему возникает ошибка при удаленном вызове COM-объекта?

Перед тем как перейти к настройке, проанализируем физический смысл происходящего. Ошибка инициализации COM-объекта на удаленном сервере при выполнении кода Новый COMОбъект("EtranASUGO.EtranASUGO", "trnh-db-01") чаще всего обусловлена следующими техническими факторами:

  1. Конфликт разрядности систем (32/64 бит): Рабочий процесс сервера 1С (rphost.exe), как правило, функционирует в 64-битной среде. Если библиотека EtranASUGO.dll является 32-битной, то 64-битный процесс сервера 1С не сможет загрузить ее напрямую в свое адресное пространство.
  2. Отсутствие регистрации DLL в реестре Windows: Компонента должна быть корректно зарегистрирована в системном реестре на целевой машине (DB-01) через утилиту регистрации серверов regsvr32.
  3. Ограничения безопасности DCOM: Операционная система Windows по умолчанию блокирует удаленный запуск (активацию) COM-компонентов из соображений сетевой безопасности. Учетная запись службы, под которой запущен сервер 1С на машине DB-02, не имеет прав на удаленный запуск объектов на машине DB-01.

Ниже мы подробно рассмотрим три метода решения этой задачи: от классической настройки распределенного COM (DCOM) до современных архитектурных подходов.

Решение 1. Настройка удаленного доступа через COM+ (DCOM)

Если мы хотим оставить архитектуру вызова COM-объекта с удаленного сервера без изменений, нам необходимо настроить специальную обертку на сервере DB-01 (где установлена компонента ЭТРАН). Это позволит запускать 32-битную DLL в суррогатном 64-битном процессе операционной системы и управлять правами доступа по сети.

Рассмотрим по шагам процесс настройки службы компонентов Windows:

  1. На сервере DB-01 зарегистрируем библиотеку в системном реестре. Для этого откроем командную строку от имени администратора и выполним команду регистрации. Обратите внимание: если библиотека 32-битная, использовать нужно утилиту из папки SysWOW64: C:\Windows\SysWOW64\regsvr32.exe "C:\PathToComponent\EtranASUGO.dll"
  2. Откроем оснастку настройки служб компонентов. Для этого нажмем сочетание клавиш Win+R, введем команду dcomcnfg и нажмем Enter.
  3. В открывшемся окне перейдем по дереву каталогов: Службы компонентов — Компьютеры — Мой компьютер — Приложения COM+.
  4. Нажмем правой кнопкой мыши на раздел «Приложения COM+» и выберем пункт меню Создать — Приложение. Откроется мастер установки приложений COM+.
  5. Нажмем «Далее», выберем вариант «Создать новое пустое приложение». Введем понятное имя, например, Etran_COM_Bridge, и установим способ активации как «Серверное приложение». Это критически важно, так как приложение будет запускаться в отдельном системном процессе dllhost.exe.
  6. На этапе выбора удостоверения (Identity) укажем конкретного пользователя Windows (желательно доменного администратора или специально созданного локального пользователя с правами администратора на обеих машинах), под которым будет выполняться данный процесс. Крайне не рекомендуется оставлять значение «Интерактивный пользователь».
  7. В созданном приложении перейдем в ветку Компоненты. Нажмем правой кнопкой мыши, выберем Создать — Компонент. В мастере выберем пункт «Установка новых компонентов» и укажем путь к нашей зарегистрированной библиотеке EtranASUGO.dll.
  8. Зайдем в свойства созданного приложения COM+ (нажав правой кнопкой мыши на Etran_COM_Bridge и выбрав «Свойства»). На вкладке «Безопасность» снимем флажок «Принудительная проверка доступа для приложений» и установим уровень аутентификации в значение «Отсутствует» (или настроим роли для пользователя, под которым запускается сервер 1С на машине DB-02).
  9. Настроим сетевой брандмауэр (Windows Firewall) между серверами DB-01 и DB-02. Для корректной работы DCOM необходимо открыть порт RPC (TCP 135), а также диапазон динамических портов RPC (в современных ОС Windows это диапазон портов 49152-65535).

После выполнения этих настроек программный код инициализации COM-объекта из базы 1С на сервере DB-02 будет успешно отрабатывать на удаленном сервере DB-01:


ИмяСервераЭтран = "trnh-db-01"; // Имя или IP-адрес удаленного сервера
Попытка
    Etran = Новый COMОбъект("EtranASUGO.EtranASUGO", ИмяСервераЭтран);
    // Дальнейшая работа с объектом
    Результат = Etran.GetSomeData();
Исключение
    ЗаписьЖурналаРегистрации("ЭТРАН.Подключение", УровеньЖурналаРегистрации.Ошибка,,, 
        "Ошибка инициализации COM на сервере " + ИмяСервераЭтран + ": " + ОписаниеОшибки());
    ВызватьИсключение "Не удалось подключиться к системе ЭТРАН.";
КонецПопытки;

Важное примечание: Инициализация COM-соединения по сети между двумя серверами может происходить достаточно медленно (в среднем от 5 до 15 секунд). Если регламентное задание запускается часто, этот метод может создать существенные задержки в работе системы.

Решение 2. Требования назначения функциональности в кластере 1С

Если серверы DB-01 и DB-02 объединены в единый кластер 1С:Предприятия, мы можем полностью избежать сетевых вызовов DCOM. Вместо того чтобы вызывать компоненту удаленно, мы заставим саму платформу 1С выполнять конкретное регламентное задание строго на том сервере, где физически установлена DLL и настроен защищенный канал VipNet (в нашем случае это DB-01).

Для реализации этого сценария настроим требования назначения функциональности кластера 1С:

  1. Откроем консоль администрирования кластера серверов 1С:Предприятия.
  2. Перейдем в список рабочих серверов нашего кластера (там будут отображаться DB-01 и DB-02).
  3. Откроем свойства рабочего сервера DB-01 и перейдем в раздел «Требования назначения функциональности».
  4. Добавим новое разрешающее требование: - Объект требования: Клиентское соединение с ИБ (или Фоновое задание). - Тип требования: Назначать. - Способ идентификации: По имени фонового задания (или по имени общего модуля). - Параметр: Укажем точное имя нашего регламентного задания, отвечающего за обмен с ЭТРАН.
  5. Откроем свойства рабочего сервера DB-02, зайдем в «Требования назначения функциональности» и добавим противоположное, запрещающее требование: - Объект требования: Клиентское соединение с ИБ (или Фоновое задание). - Тип требования: Не назначать. - Способ идентификации: По имени фонового задания. - Параметр: Указываем имя того же регламентного задания.
  6. Применим настройки кластера.

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


Попытка
    Etran = Новый COMОбъект("EtranASUGO.EtranASUGO");
Исключение
    ЗаписьЖурналаРегистрации("ЭТРАН.Локально", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

Важное лицензионное ограничение: Возможность гибкой настройки требований назначения функциональности (включая фильтрацию по конкретным именам баз данных и фоновым задачам) доступна пользователям только при наличии серверных лицензий уровня 1С:Предприятие КОРП. На лицензиях уровня ПРОФ данные настройки заблокированы для детальной конфигурации.

Решение 3. Переход на SOAP Веб-сервисы (Рекомендуемый современный метод)

Использование COM-технологий постепенно уходит в прошлое. Самым стабильным, быстрым и платформонезависимым подходом является интеграция с АС ЭТРАН через встроенные SOAP веб-сервисы ОАО «РЖД». В этом случае нам не нужно регистрировать библиотеки в реестре Windows, настраивать COM+ и зависеть от разрядности серверов.

Однако возникает другая техническая сложность: защищенный канал VipNet для доступа к ресурсам РЖД настроен только на сервере DB-01. Как же серверу DB-02 отправлять SOAP-запросы, если у него нет прямого доступа в сеть VipNet?

Для решения этой проблемы разберем архитектуру с использованием прокси-сервера:

  1. На сервере DB-01 (на котором установлен клиент VipNet и есть доступ к шлюзам РЖД) установим и настроим локальный HTTP-прокси-сервер (например, CCProxy, Squid или стандартный IIS / Apache с настроенным модулем обратного проксирования Reverse Proxy).
  2. Настроим прокси-сервер таким образом, чтобы он принимал входящие сетевые запросы с сервера DB-02 на определенный порт (например, port 8080) и перенаправлял их в защищенную сеть VipNet по адресу веб-сервиса ЭТРАН.
  3. В коде 1С на сервере DB-02 будем использовать штатные объекты платформы для работы с веб-сервисами: WSОпределения и WSПрокси, передавая в них параметры нашего прокси-сервера.

Посмотрим на пример реализации подключения к SOAP веб-сервису через прокси-сервер:


// 1. Настройка параметров прокси-сервера, развернутого на DB-01
ПроксиПараметры = Новый ИнтернетПрокси;
ПроксиПараметры.Установить("http", "192.168.1.10", 8080); // IP-адрес DB-01 и порт прокси
ПроксиПараметры.Пользователь = "ProxyUser"; // Если на прокси настроена авторизация
ПроксиПараметры.Пароль = "ProxyPassword";

// 2. URL-адрес WSDL-описания веб-сервиса АС ЭТРАН (предоставляется РЖД)
АдресWSDL = "http://etranserver.rzd/AppServer/IEtranSysservice?wsdl"; 

Попытка
    // Инициализация WS-определений с использованием прокси-сервера
    Определения = Новый WSОпределения(АдресWSDL, "ИмяПользователяЭтран", "ПарольЭтран", ПроксиПараметры);
    
    // Создание прокси-объекта для вызова методов веб-сервиса
    // Параметры: Определения, ПространствоИмен, ИмяСервиса, ИмяТочкиПодключения
    ПроксиЭтран = Новый WSПрокси(Определения, "http://tempuri.org/", "IEtranSysservice", "IEtranSysport");
    ПроксиЭтран.Пользователь = "ИмяПользователяЭтран";
    ПроксиЭтран.Пароль = "ПарольЭтран";
    
    // 3. Подготовка XML-запроса по схеме АСУ-АСУ ЭТРАН
    ТекстЗапросаXML = "<EtranRequest>...</EtranRequest>";
    
    // Вызов удаленного метода веб-сервиса через защищенный канал
    РезультатОтвета = ПроксиЭтран.ExecuteBlock(ТекстЗапросаXML);
    
    // Анализ полученного XML-ответа
    ПроанализироватьОтветЭтран(РезультатОтвета);

Исключение
    ЗаписьЖурналаРегистрации("ЭТРАН.SOAP", УровеньЖурналаРегистрации.Ошибка,,, 
        "Ошибка выполнения SOAP-запроса к ЭТРАН: " + ОписаниеОшибки());
    ВызватьИсключение "Не удалось отправить запрос в систему ЭТРАН через SOAP-прокси.";
КонецПопытки;

Этот подход обладает огромными преимуществами. Во-первых, скорость выполнения SOAP-запроса через локальный прокси-сервер занимает доли секунды по сравнению с медленным DCOM-соединением. Во-вторых, код становится полностью кроссплатформенным, что позволит в будущем безболезненно перевести серверы 1С на операционную систему Linux.

Мы детально рассмотрели три способа обхода ограничений при удаленной работе с компонентами интеграции. Выбор конкретного метода зависит от технических требований вашей инфраструктуры, версии лицензий 1С и долгосрочных планов по модернизации систем автоматизации бизнеса.

← На главную