Как исправить ошибку несоответствия версий клиента и сервера при COM-соединении в 1С?

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

При организации обмена данными между информационными базами 1С через COM-соединение разработчики нередко сталкиваются с ситуацией, когда на рабочей станции или сервере установлено несколько различных версий платформы 1С:Предприятие. В таких условиях стандартный вызов объекта COM может завершиться аварийно с одной из двух ошибок: «Несоответствие версий клиента и сервера 1С:Предприятия» либо «Класс не зарегистрирован (0x80040154)». Разберем детально, почему это происходит и как правильно настроить окружение для стабильной работы обмена.

Проанализируем причины возникновения ошибок

Посмотрим на типовой программный код, который инициирует внешнее подключение к информационной базе:


&НаСервере
Функция ПодключитьсяКCOMБазе(СтрокаИнициализации) Экспорт
    db = Новый COMОбъект("V83.ComConnector"); 
    V8 = db.Connect(СтрокаИнициализации);
    Возврат V8;
КонецФункции

При выполнении этого кода система обращается к системному реестру Windows по программному идентификатору V83.ComConnector. Выясним причину возникающих сбоев:

  1. Единый идентификатор ProgID для всей линейки 8.3. В отличие от перехода между ветками 8.1, 8.2 и 8.3, внутри всей линейки 8.3 (например, 8.3.8 и 8.3.10) используется единый идентификатор V83.COMConnector. Платформа 1С не создает версионных идентификаторов для промежуточных релизов. При установке нового релиза путь к библиотеке comcntr.dll в реестре автоматически перезаписывается на последнюю установленную версию. Если серверная база работает на платформе 8.3.8, а в реестре зарегистрирован коннектор от 8.3.10, метод Connect вернет ошибку несоответствия версий.
  2. Несовпадение разрядности (32-бит и 64-бит). Ошибка с кодом -2147221164 (0x80040154): Класс не зарегистрирован чаще всего возникает при несовпадении битности вызывающего процесса и зарегистрированной библиотеки. Библиотека comcntr.dll является внутрипроцессным COM-сервером (in-process server) и загружается прямо в адресное пространство процесса. Если 64-битный клиент или рабочий процесс сервера 1С пытается вызвать 32-битный COM-коннектор (или наоборот), Windows сообщает, что подходящий класс не зарегистрирован.
  3. Отсутствие прав администратора при установке. Если обновление платформы производилось без повышенных прав, COM-компоненты могут не прописаться в системную ветку HKEY_CLASSES_ROOT.

Способ 1. Ручная регистрация нужной версии comcntr.dll через regsvr32

Рассмотрим самый быстрый способ восстановления работоспособности обмена. Если на машине установлены разные платформы, зарегистрируем библиотеку той версии, которая точно совпадает с версией целевой базы (в нашем примере — 8.3.8.1964).

Разберем по шагам правильный вызов утилиты с учетом разрядности операционной системы и платформы:

  1. Запустим командную строку (cmd) обязательно от имени администратора.
  2. Для регистрации 32-битной библиотеки 1С на 64-битной версии Windows используем утилиту из каталога SysWOW64:
    
    %SystemRoot%\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.8.1964\bin\comcntr.dll"
    
  3. Для регистрации 64-битной библиотеки 1С запускаем штатную утилиту из System32:
    
    %SystemRoot%\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.8.1964\bin\comcntr.dll"
    

После выполнения команды появится уведомление об успешной регистрации. Теперь вызов Новый COMОбъект("V83.ComConnector") будет инициализировать именно ту версию, которая установлена на сервере.

Способ 2. Изоляция COM-компонента через приложение COM+

Рассмотрим более надежный и профессиональный метод, если на одном компьютере требуется поддерживать одновременную работу с базами разных релизов или устранить конфликт разрядностей 32 и 64 бит. Оформим библиотеку как серверное приложение COM+ через оснастку «Службы компонентов» (dcomcnfg):

  1. Откроем оснастку «Службы компонентов» (нажмем Win + R, введем dcomcnfg и нажмем Enter).
  2. Перейдем по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Создадим новое приложение: нажмем правой кнопкой мыши по ветке Приложения COM+, выберем Создать -> Приложение. В мастере выберем «Установить новое приложение» и зададим понятное имя (например, 1Cv8_8.3.8.1964).
  4. На шаге «Режим активации» обязательно выберем Серверное приложение (Server Application). Это заставит COM-объект запускаться в отдельном процессе dllhost.exe.
  5. Укажем учетную запись пользователя, от имени которой будет стартовать процесс (рекомендуется указать локального или доменного администратора с постоянным паролем).
  6. В созданном приложении раскроем ветку Компоненты, нажмем правой кнопкой мыши и выберем Создать -> Компонент.
  7. Выберем вариант «Установка новых компонентов» и укажем путь к comcntr.dll требуемой версии (каталог bin нужного релиза).

Такой подход изолирует компонент от вызовов операционной системы, снимает проблему конфликта разрядности 32/64 бит и исключает перезапись связей при автоматическом обновлении платформы.

Способ 3. Пакетная перерегистрация dll перед сеансом

Если нет возможности настроить COM+, а обмен выполняется по расписанию (например, через ночные скрипты), применим регистрацию в «тихом» режиме. Напишем bat-файл, выполняющий перерегистрацию перед стартом рабочего процесса:


rem Регистрация библиотеки нужного релиза перед выполнением обмена
regsvr32 /s "C:\Program Files (x86)\1cv8\8.3.8.1964\bin\comcntr.dll"

Параметр /s отключает всплывающие диалоговые окна Windows, что позволяет автоматизировать процесс.

Современные альтернативы устаревшему COM-соединению

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

  1. HTTP-сервисы и веб-сервисы (SOAP). Полноценные механизмы интеграции, не зависящие от платформы и операционной системы. Обмен данными осуществляется по стандартным веб-протоколам с использованием XML или JSON.
  2. Стандартный интерфейс OData (REST API). Встроенная в платформу 8.3 функциональность, позволяющая получать доступ к объектам конфигурации без написания программного кода. Достаточно опубликовать информационную базу на веб-сервере с флагом публикации OData, после чего внешние базы смогут читать и записывать данные через стандартные HTTP-запросы.

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

← На главную