Проблема использования COM-соединения (V83.COMConnector) при взаимодействии серверов, находящихся в разных локальных сетях или подключенных через интернет, является классической для специалистов 1С. В данной статье мы подробно разберем, почему «зависает» система при попытке подключения, почему технология DCOM плохо подходит для современной сетевой инфраструктуры и какие существуют альтернативные способы интеграции, обеспечивающие стабильную работу.
Для начала проанализируем ситуацию, когда два сервера 1С пытаются связаться через COM-объект вне единого сетевого контура. Основная причина кроется в архитектуре DCOM (Distributed COM). Рассмотрим пошагово, что происходит в этот момент:
135 (RPC Endpoint Mapper). Этот порт обычно открыт в локальных сетях, но часто блокируется брандмауэрами при работе через интернет.49152–65535). Если хотя бы один из этих портов закрыт или не проброшен через NAT, соединение «повисает», так как клиент ждет ответа, который блокируется сетевым экраном.Рассмотрим также проблему разрядности. Часто бывает, что сервер 1С работает в 64-битном режиме, а COM-компонента зарегистрирована как 32-битная (или наоборот). Это приводит к конфликтам памяти и также может вызывать бесконечное ожидание отклика процесса.
Если архитектура системы требует использования именно COM-соединения, проанализируем вариант с организацией защищенного канала. Рассмотрим, почему это помогает:
VPN (Virtual Private Network) создает виртуальный туннель, внутри которого серверы «видят» друг друга так, будто они находятся в одной локальной сети. Это снимает проблему блокировки динамических портов и трансляции IP-адресов. Однако, как отмечено в обсуждении, использование VPN не всегда допустимо по соображениям безопасности или политики компании.
Если VPN запрещен, можно рассмотреть настройку SSH-туннелирования для порта 135 и ограниченного диапазона портов DCOM, предварительно зафиксировав этот диапазон в настройках операционной системы Windows через оснастку «Службы компонентов» (dcomcnfg).
Выясним, почему HTTP-сервисы являются современным стандартом обмена данными в 1С. В отличие от COM, HTTP работает через один фиксированный порт (обычно 80 или 443), который легко пробрасывается через любые роутеры и не требует взаимного доверия доменов Windows.
Разберем по шагам, как реализовать получение данных из «Бухгалтерии предприятия» (БП) в «Управлении торговлей» (УТ) через HTTP-сервис:
1. В базе-источнике (БП) создадим HTTP-сервис. Пропишем шаблон URL, например, /get_data/{id}.
2. Напишем обработчик запроса в модуле сервиса:
Функция Данные_Get_Data(Запрос)
Идентификатор = Запрос.ПараметрыURL.Получить("id");
// Выполняем поиск данных в базе
НайденнаяСсылка = Справочники.Номенклатура.НайтиПоКоду(Идентификатор);
Если НайденнаяСсылка.Пустая() Тогда
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Наименование", НайденнаяСсылка.Наименование);
СтруктураДанных.Вставить("Остаток", 100); // Пример получения остатка
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
Результат = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(Результат);
Возврат Ответ;
КонецФункции
3. В базе-приемнике (УТ) проанализируем код вызова этого сервиса:
Соединение = Новый HTTPСоединение("server-bp.com", , "login", "password");
Запрос = Новый HTTPЗапрос("/base_name/hs/get_data/00001");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить("Получено наименование: " + Данные.Наименование);
КонецЕсли;
Этот метод полностью исключает зависания, характерные для V83.COMConnector, так как HTTP-протокол имеет встроенные механизмы работы с таймаутами.
Если отказаться от COM невозможно, разберем способ изоляции COM-соединения в отдельном процессе. Это поможет, если зависание связано с конфликтом 32/64-битных систем.
1C_COM_Connector.comcntfg.dll (находится в папке bin установленной платформы 1С).Проанализируем результат: теперь COM-соединение будет запускаться в контексте отдельного системного процесса dllhost.exe. Это не решит сетевых проблем с портами, но значительно повысит стабильность работы самого коннектора и позволит избежать падения основного рабочего процесса сервера 1С.
Посмотрим на встроенный механизм 1С, который позволяет получать данные без написания программного кода на стороне сервера-источника. OData — это стандарт, который 1С поддерживает «из коробки».
Достаточно опубликовать базу на веб-сервере (IIS или Apache) и установить галочку «Публиковать стандартные интерфейсы OData». После этого мы сможем получать данные простым GET-запросом из любого приложения, включая другую базу 1С, используя стандартные средства работы с HTTP. Это идеальный вариант для задачи «взятия информации для формирования документов», описанной автором темы.
Проанализировав ситуацию, мы пришли к выводу, что зависание COM-соединения между разными серверами — это не программная ошибка 1С, а ограничение технологии DCOM при работе в сложных сетях.
Для решения проблемы рекомендуем следующее:
telnet на порт 135. Если порт закрыт, COM-соединение работать не будет.Помните, что технология COM официально считается Microsoft устаревшей для межсерверного взаимодействия. Переход на веб-технологии не только решит текущую проблему с зависанием, но и сделает вашу систему более масштабируемой и безопасной.