При интеграции различных информационных баз 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда необходимо настроить автоматический обмен данными между серверами, работающими на разных релизах платформы. Типичный сценарий: База 1 (источник) на платформе 8.3.13.14 должна подключиться через COM-соединение к Базе 2 (приемник), которая функционирует на сервере с платформой 8.3.13 другого релиза, и в этой целевой базе в данный момент активно работают пользователи.
В этой статье мы подробно разберем, насколько жизнеспособна такая схема, какие подводные камни могут возникнуть при ее реализации, как настроить Windows для корректной работы разных версий библиотек 1С и почему в современных реалиях лучше отказаться от технологии COM в пользу HTTP-сервисов.
Первый вопрос, который волнует разработчиков: не помешают ли работающие пользователи установке внешнего соединения? С технической точки зрения активные сеансы пользователей в целевой базе никак не препятствуют COM-подключению. Для кластера серверов 1С и СУБД такое подключение позиционируется как обычный дополнительный сеанс (внешнее соединение). Однако здесь важно учитывать три критических аспекта:
rphost Сервера 2, что также отразится на отзывчивости интерфейса у активных пользователей.Главная сложность при COM-соединении баз с разными платформами кроется в жестком требовании технологической платформы 1С: версия библиотеки comcntr.dll на стороне инициатора (Сервер 1) должна в точности совпадать с версией платформы целевого сервера (Сервер 2).
Даже если разница в версиях минимальна (например, на Сервере 1 установлена платформа 8.3.13.1472, а на Сервере 2 — более свежий релиз той же ветки 8.3.13.1800), стандартное COM-подключение без предварительной настройки завершится ошибкой: «Различаются версии клиента и сервера».
Дело в том, что операционная система Windows хранит в системном реестре путь только к одной зарегистрированной библиотеке comcntr.dll (обычно к той, которая устанавливалась или регистрировалась последней). Если мы просто зарегистрируем библиотеку от целевой базы через утилиту regsvr32, то сломаются локальные COM-подключения на Сервере 1, которым требуется его "родная" версия платформы.
Чтобы обойти ограничение операционной системы и заставить сервер 1С использовать строго определенную версию библиотеки для конкретного подключения, настроим изолированное приложение в Службах компонентов Windows (COM+). Разберем этот процесс по шагам:
Шаг 1. Подготовка платформы. На Сервере 1 (инициаторе подключения) обязательно должен быть установлен тот релиз платформы 1С, который работает на целевом Сервере 2. Нам физически необходимы файлы этого релиза, в частности, библиотека comcntr.dll, расположенная в каталоге установки (например, C:\Program Files\1cv8\8.3.13.XXXX\bin\).
Шаг 2. Создание приложения COM+. Откроем панель управления «Службы компонентов» (команда dcomcnfg в строке выполнения Windows). В дереве консоли перейдем к ветке «Компьютеры» — «Мой компьютер» — «Приложения COM+». Нажмем правой кнопкой мыши и выберем «Создать» — «Приложение». В мастере создания выберем «Создать новое приложение», укажем его имя (например, 1C_COM_8.3.13) и установим способ активации — «Серверное приложение». Это позволит изолировать работу компонента в отдельном системном процессе dllhost.exe.
Шаг 3. Добавление компонента. Внутри созданного приложения перейдем в папку «Компоненты», нажмем правую кнопку мыши и выберем «Создать» — «Компонент». Выберем пункт «Установка новых компонентов» и укажем путь к файлу comcntr.dll нужного релиза платформы 1С на Сервере 1.
Шаг 4. Настройка уникального ProgID (псевдонима). Чтобы код 1С мог обращаться именно к этой изолированной версии библиотеки, нам нужно изменить ее программный идентификатор. В свойствах созданного компонента на вкладке «Общие» укажем уникальное имя в поле «Программный идентификатор (ProgID)», например: V83_13.COMConnector.
Теперь проанализируем, как изменится код подключения в нашей конфигурации 1С. Рассмотрим стандартный шаблон инициализации соединения:
// Стандартный вызов, который использует зарегистрированную в реестре версию
Попытка
РазработчикКоннектор = Новый COMОбъект("V83.COMConnector");
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, "Ошибка создания базового COM: " + ОписаниеОшибки());
КонецПопытки;
Для подключения к базе с другой платформой мы будем использовать наш настроенный в COM+ компонент с уникальным псевдонимом:
// Использование изолированного COM-соединителя конкретной версии платформы
Попытка
ИмяКоннектора = "V83_13.COMConnector"; // Наш псевдоним из настроек COM+
COMКоннектор = Новый COMОбъект(ИмяКоннектора);
СтрокаПодключения = "Srvr=""Server2"";Ref=""Base2"";Usr=""ExchangeUser"";Pwd=""StrongPassword"";";
СоединениеСБазой = COMКоннектор.Connect(СтрокаПодключения);
// Код выполнения операций в удаленной базе данных
// ...
СоединениеСБазой = Неопределено;
COMКоннектор = Неопределено;
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, "Не удалось установить соединение через COM+: " + ОписаниеОшибки());
КонецПопытки;
Важное примечание для типовых конфигураций: Если ваша база использует Библиотеку Стандартных Подсистем (БСП), то имя COM-соединителя часто формируется динамически в общих модулях (например, функция ИмяCOMСоединителя()). В таком случае потребуется внести незначительные изменения в код БСП через расширение, чтобы система подставляла ваш кастомный ProgID при подключении к этой конкретной базе.
Дополнительным преимуществом использования COM+ является стабильность: если во время обмена произойдет критический сбой или утечка памяти, это приведет лишь к перезапуску изолированного процесса dllhost.exe, но не «уронит» рабочий процесс сервера 1С rphost.
Хотя технология COM+ решает проблему несовместимости версий, современные стандарты разработки в среде 1С предписывают отказываться от COM-соединений в пользу HTTP-сервисов. Выделим ключевые причины, почему этот переход необходим:
Рассмотрим пример того, как лаконично выглядит отправка запроса к целевой базе через HTTP-сервис взамен тяжеловесного COM-подключения:
// Пример выполнения обмена данными через HTTP-сервис вместо COM
HTTPСоединение = Новый HTTPСоединение("server2.domain.local", 80, "ExchangeUser", "StrongPassword",,, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос("/Base2/hs/v1/get_exchange_data");
// Добавим параметры запроса при необходимости
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
// Производим чтение и обработку полученного JSON или XML
// ...
Иначе
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Предупреждение,,, "Сервер вернул код ошибки: " + HTTPОтвет.КодСостояния);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, "Ошибка связи по HTTP: " + ОписаниеОшибки());
КонецПопытки;
Подводя итог, отметим: подключение по COM к базе с другой версией платформы при работающих пользователях технически возможно и реализуется через создание серверного приложения COM+. Однако для обеспечения надежности, масштабируемости и кроссплатформенности вашей системы настоятельно рекомендуется переводить архитектуру интеграции на современные HTTP-сервисы.