Как восстановить обмен через COM-соединение при использовании разных версий платформы 1С на разных серверах?

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

При эксплуатации информационных систем 1С часто возникает ситуация, когда две базы (например, «Управление автотранспортом» и «Бухгалтерия предприятия») должны обмениваться данными в автоматическом режиме. Если ранее базы находились на одном физическом сервере, прямой обмен через УниверсальныйОбменВФорматеXML работал без нареканий. Однако после разнесения баз на разные серверы или при обновлении платформы на одном из них механизм часто «ломается». Рассмотрим причины возникновения этой проблемы и разберем по шагам способы ее решения.

Почему ломается COM-соединение при разнесении баз?

Проанализируем ситуацию: когда мы используем прямое подключение, база-инициатор пытается создать объект V83.COMConnector. Для успешного создания этого объекта в операционной системе должна быть зарегистрирована соответствующая библиотека comcntr.dll. Основные сложности возникают в следующих случаях:

  1. Несоответствие версий: На сервере-источнике зарегистрирована библиотека версии 8.3.22, а база-приемник требует версию 8.3.25.
  2. Разная разрядность: Сервер 1С работает в 64-битном режиме, а попытка подключения требует 32-битной библиотеки (или наоборот).
  3. Сетевые ограничения: После переноса на другой сервер прямое обращение к COM-объекту через границы серверов требует настройки DCOM, что является крайне сложной и небезопасной процедурой.

Выясним, как обойти эти ограничения, используя проверенные технические методы.

Решение 1: Использование COM+ приложения для изоляции версий

Это наиболее технически грамотный способ, если вы хотите сохранить работу через V83.COMConnector. Мы создадим специальный «контейнер» в Windows, который позволит принудительно использовать нужную версию библиотеки comcntr.dll, независимо от того, какая версия платформы установлена основной.

Рассмотрим алгоритм настройки:

  1. Откроем «Службы компонентов» (команда dcomcnfg в строке выполнения).
  2. Перейдем в ветку «Компьютеры» — «Мой компьютер» — «Приложения COM+».
  3. Создадим новое пустое приложение. Назовем его, например, 1C_COM_Connector_8_3_XX.
  4. В свойствах созданного приложения на вкладке «Удостоверение» укажем пользователя, от имени которого будет запускаться процесс (обычно это системная учетная запись USR1CV8).
  5. В ветке нашего приложения выберем «Компоненты» и добавим новый компонент. Нужно выбрать «Установка новых компонентов» и указать путь к файлу comcntr.dll из конкретной папки установленной платформы (например, C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll).

Важный момент: Такая настройка позволяет запускать dllhost.exe в отдельном процессе, что решает проблемы разрядности и конфликта версий библиотек в реестре Windows. Проанализируем, как это влияет на код: в самой 1С программный код вызова остается прежним, но система теперь будет брать библиотеку из нашего настроенного контейнера.

Решение 2: Публикация базы через веб-сервер (HTTP/Web-сервисы)

Современным стандартом считается отказ от COM в пользу веб-технологий. Это «убивает двух зайцев»: решается проблема версий и снимается вопрос сетевого доступа между серверами. Рассмотрим, как это реализовать.

Если мы используем типовой «Универсальный обмен данными», мы можем опубликовать базу-приемник на веб-сервере (IIS или Apache). Вместо строки соединения COM нам потребуется URL опубликованной базы. Несмотря на то что стандартная обработка заточена под COM, многие специалисты используют эмуляцию COM-передачи данных через HTTP-сервисы.

Посмотрим на пример логики, которая реализуется при переходе на веб-сервисы:


// Пример структуры вызова обмена через веб-сервис (вместо COM)
ОпределениеСервиса = Новый WSОпределения(URL_ВебСервиса, ИмяПользователя, Пароль);
Прокси = Новый WSПрокси(ОпределениеСервиса, "http://www.site.ru/exchange", "ExchangeService", "ExchangeSoap");
Результат = Прокси.ВыполнитьЗагрузкуДанных(ДанныеВФорматеXML);

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

Решение 3: Файловый обмен через общую сетевую папку

Если бюджет на разработку ограничен, а настроить COM+ не удается, проанализируем вариант с промежуточным файлом. Многие недооценивают этот метод, считая его «медленным», однако для регламентных заданий это не критично.

Разберем этапы реализации:

  1. На одном из серверов создается сетевая папка.
  2. Критически важно: Пользователь USR1CV8 (от имени которого работает агент сервера 1С) на обоих серверах должен иметь полные права (чтение и запись) на эту папку.
  3. В базе-источнике настраивается регламентное задание, которое выгружает данные в XML-файл в эту папку.
  4. В базе-приемнике создается ответное регламентное задание, которое мониторит появление файла и загружает его.

Пример кода для проверки наличия файла в регламентном задании:


ФайлНаДиске = Новый Файл("\\ServerName\ExchangeFolder\data.xml");
Если ФайлНаДиске.Существует() Тогда
    // Запускаем стандартную обработку загрузки XML
    УниверсальныйОбменДанными = Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать();
    УниверсальныйОбменДанными.ИмяФайлаОбмена = ФайлНаДиске.ПолноеИмя;
    УниверсальныйОбменДанными.РежимОбмена = "Загрузка";
    УниверсальныйОбменДанными.ВыполнитьЗагрузку();
    // После загрузки файл нужно удалить или переместить в архив
    УдалитьФайлы(ФайлНаДиске.ПолноеИмя);
КонецЕсли;

Современные альтернативы и формат EnterpriseData

Проанализируем перспективу: если вы планируете масштабное обновление систем, стоит рассмотреть переход на формат EnterpriseData (Конвертация данных 3.0). В отличие от старого «Универсального обмена», этот механизм:

Резюме

Подведем итоги нашего анализа. Если нужно починить обмен «здесь и сейчас» без изменения кода — используйте настройку COM+ приложения в службах компонентов Windows. Это позволит изолировать нужную версию comcntr.dll. Если же вы смотрите в сторону стабильности и планируете переход на Linux или облачные инфраструктуры — единственным верным решением будет публикация баз и переход на обмен через HTTP-сервисы или формат EnterpriseData.

← На главную