Обязательно ли совпадение версий платформы баз при соединении по COM?

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

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

Механизм работы COM-соединения и проблема версий

Рассмотрим стандартную ситуацию: из одной клиент-серверной базы (база-инициатор) нам необходимо подключиться к другой серверной базе (база-приемник). Для этого в коде 1С мы создаем объект COMОбъект("V83.ComConnector"). В этот момент операционная система Windows обращается к реестру, находит ветку с идентификатором V83.ComConnector и загружает соответствующую библиотеку comcntr.dll.

Проанализируем основную проблему: в системном реестре Windows под одним именем (ProgID) может быть зарегистрирована только одна версия библиотеки. Обычно это версия того релиза 1С, который был установлен последним. Если на сервере-инициаторе установлена платформа 8.3.20.1500, а база-приемник работает на релизе 8.3.15.1830, стандартный вызов коннектора может привести к ошибке несоответствия версий или ошибке формата потока. Система требует, чтобы версия comcntr.dll на стороне клиента (или сервера, выполняющего код) точно соответствовала версии платформы, работающей на стороне сервера целевой базы.

Вариант 1. Использование COM+ (Component Services) для изоляции версий

Это наиболее надежный и профессиональный способ решения задачи. Разберем по шагам, как настроить "обертку" для COM-объекта, которая позволит использовать конкретную версию comcntr.dll независимо от того, что зарегистрировано в реестре системы по умолчанию.

Суть метода заключается в создании приложения в консоли "Службы компонентов" (Component Services). Это позволяет запускать COM-объект в отдельном процессе dllhost.exe, что решает не только проблему версий, но и проблему разрядности (например, когда 64-битный сервер 1С должен вызвать 32-битную компоненту).

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

Теперь при обращении к V83.ComConnector система будет использовать изолированную версию компоненты. Если нам нужно поддерживать несколько разных соединений, мы можем создать несколько приложений COM+ с разными именами и обращаться к ним через их CLSID.

Вариант 2. Динамическая регистрация библиотеки "на лету"

Рассмотрим другой подход, который часто применяется в скриптах или внешних обработках. Мы можем программно перерегистрировать нужную нам библиотеку в реестре непосредственно перед созданием COM-объекта. Проанализируем пример кода:


// Путь к нужной версии библиотеки
ПутьКDLL = "C:\Program Files\1cv8\8.3.15.1830\bin\comcntr.dll";

// Регистрация компоненты в системе через regsvr32
КомандаСистемы = "regsvr32 /s """ + ПутьКDLL + """";
ЗапуститьПриложение(КомандаСистемы, , Истина);

// Создание объекта после регистрации
Попытка
    Соединитель = Новый COMОбъект("V83.ComConnector");
    // Установка соединения...
Исключение
    Сообщить("Не удалось создать COM-соединитель: " + ОписаниеОшибки());
КонецПопытки;

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

Вариант 3. Использование V83.Application (OLE Automation)

Выясним причину, почему иногда советуют использовать V83.Application вместо V83.ComConnector. Объект V83.Application запускает полноценный экземпляр приложения 1С (в невидимом режиме). Это менее требовательно к версии зарегистрированной DLL, так как управление берет на себя исполняемый файл 1cv8.exe.

Однако у этого метода есть существенные недостатки:

Сравнение COM-соединения и Web/HTTP-сервисов

Проанализируем ситуацию в долгосрочной перспективе. Многие эксперты рекомендуют полностью отказаться от COM-технологий в пользу современных HTTP-сервисов. Рассмотрим почему:

  1. Независимость от версий: HTTP-запросу совершенно неважно, на какой версии платформы написана база-отправитель и база-получатель. Вы просто передаете данные (JSON или XML).
  2. Стабильность: компонента comcntr.dll подвержена утечкам памяти и может "зависать" в процессах, что требует периодической перезагрузки сервера. HTTP-сервисы работают через веб-серверы (IIS, Apache), которые эффективно управляют пулом соединений.
  3. Безопасность: для COM-соединения часто требуются избыточные права в ОС и открытые порты, в то время как HTTP работает через стандартный порт 80 или 443.

Итоги и рекомендации

Подводя итог, ответим на вопрос автора: да, совпадение версий (вплоть до билда) крайне желательно для стандартного способа подключения. Если же версии различаются, придерживайтесь следующего алгоритма:

1. Если базы находятся в одной локальной сети и обновление невозможно — используйте настройку через COM+ (Component Services). Это изолирует библиотеку и позволит работать процессам с разной разрядностью.

2. Если вам нужно разовое подключение и у службы 1С есть права администратора — используйте динамическую регистрацию DLL через regsvr32.

3. В новых проектах старайтесь закладывать архитектуру на базе HTTP-сервисов. Это избавит вас от необходимости администрирования реестра Windows и обеспечит легкое масштабирование системы в будущем.

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

Соединение = Неопределено;

Это инициирует корректное завершение внешнего соединения и освобождение ресурсов платформы.

← На главную