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

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

При организации межсерверного взаимодействия баз 1С с помощью внешнего COM-соединения часто возникает техническая проблема. Если на сервере-источнике запроса и на сервере-приемнике установлены разные релизы платформы (например, 8.3.8 и 8.3.10), система выдает исключительную ситуацию вида: «Произошла исключительная ситуация (V83.Connector.1). Несоответствие версий клиента и сервера..., клиентское приложение: Com-соединение».

Разберем подробнее причины возникновения этой ошибки и проанализируем проверенные способы ее устранения, включая как настройку системных компонентов Windows, так и переход на современные протоколы обмена.

Выясним причину ошибки

Проблема заключается в архитектурных особенностях загрузки библиотек 1С в память процесса. Когда серверный процесс 1С (rphost) инициализирует COM-подключение к удаленной базе, он загружает внешнюю компоненту comcntr.dll. Данная библиотека обращается к ядрам платформы (в частности, core83.dll).

Операционная система не может одновременно загрузить в одно и то же адресное пространство одного процесса две разные версии одинаковых DLL-файлов. Платформа 1С строго требует полного совпадения не только мажорных номеров релизов, но и номера сборки (Build) клиента и сервера. Если вызывающий процесс работает на платформе 8.3.8, а целевая база располагается на сервере 8.3.10, возникает критический конфликт версий.

Решение 1. Настройка и регистрация библиотеки нужной версии

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

  1. Установка платформы: Установим клиентскую часть платформы и компоненты администрирования той версии, к которой выполняется подключение (в данном случае 8.3.10), на сервер, где работает база-источник (8.3.8).
  2. Регистрация компоненты: Зарегистрируем библиотеку comcntr.dll нужного релиза в операционной системе с помощью утилиты regsvr32.

    Важно учитывать разрядность процесса сервера 1С! Если сервер 64-разрядный, регистрация выполняется 64-битной утилитой из каталога System32:

    
    C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.10.XXXX\bin\comcntr.dll"
    

    Для 32-битной версии сервера используем утилиту из каталога SysWOW64:

    
    C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.10.XXXX\bin\comcntr.dll"
    
  3. Разделение ProgID (Псевдонимов): При стандартной регистрации класс V83.COMConnector перезаписывается последней зарегистрированной библиотекой. Чтобы использовать параллельно разные версии компонентов, настроим уникальные программные идентификаторы (ProgID) в реестре Windows или зададим явную привязку к конкретному классу библиотеки (например, создав псевдоним V8310.COMConnector).

Решение 2. Изоляция процессов через COM+ (Серверное приложение)

Проанализируем подход с использованием изолированных системных процессов Служб компонентов Windows (dcomcnfg). Этот метод предотвращает упадок процесса rphost при конфликте библиотек в памяти.

  1. Откроем Службы компонентов в Windows (команда dcomcnfg в строке выполнить).
  2. Перейдем в раздел Компьютеры > Мой компьютер > Приложения COM+.
  3. Создадим новое приложение. В ходе мастера выберем пункт Серверное приложение (Server Application). Это ключевое условие: в таком режиме компонента будет запускаться в отдельном процессе dllhost.exe, а не внутри rphost.
  4. В созданном приложении в ветке Компоненты добавим новую компоненту и выберем зарегистрированный файл comcntr.dll нужного релиза.
  5. В свойствах созданного приложения на вкладке Удостоверение укажем учетную запись с правами запуска (например, системную учетную запись или пользователя, под которым работает служба 1С).

При таком подходе вызов внешней компоненты выполняется изолированно в среде dllhost.exe, что полностью устраняет проблему пересечения библиотек в одном адресном пространстве процесса rphost.

Решение 3. Альтернативный вариант — переход на HTTP-сервисы

Рассмотрим наиболее современный и устойчивый к обновлениям подход. Использование технологии COM-соединения уходит в прошлое, привязано исключительно к ОС Windows и вызывает проблемы при обновлении платформ. Использование HTTP-сервисов полностью снимает зависимость от версий 1С.

Посмотрим, как перенести получение выборки документов с COM-запроса на HTTP-сервис:

  1. В базе-источнике (8.3.10) создадим HTTP-сервис. В обработчике метода (например, GET) пропишем логику выполнения запроса с передачей параметров через URL или тело запроса:
    
    Функция ПолучитьДанныеЗапросом(ЗапросHTTP)
        Параметры = ЗапросHTTP.ПараметрыЗапроса;
        Период = Параметры.Получить("Период");
        НомерДоговора = Параметры.Получить("НомерДоговора");
        
        // Выполняем стандартный запрос к БД 1С
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |	Ссылка, Проведение, СуммаДокумента
            |ИЗ
            |	Документ.РеализацияТоваровУслуг
            |ГДЕ
            |	Дата >= &Период И ДоговорКонтрагента.Номер = &НомерДоговора";
        Запрос.УстановитьПараметр("Период", Дата(Период));
        Запрос.УстановитьПараметр("НомерДоговора", НомерДоговора);
        
        РезультатЗапроса = Запрос.Выполнить().Выгрузить();
        
        // Сериализуем результат в JSON
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, РезультатЗапроса);
        СтрокаJSON = ЗаписьJSON.Закрыть();
        
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
        Возврат Ответ;
    КонецФункции
    
  2. В базе-приемнике (8.3.8) вызовем HTTP-сервис стандартным встроенным объектом HTTPСоединение:
    
    Соединение = Новый HTTPСоединение("server2.domain.local", 80, "User", "Password");
    Запрос = Новый HTTPЗапрос("/base2/hs/GetData/Fetch?Период=20230101&НомерДоговора=123");
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
        ТаблицаДанных = ПрочитатьJSON(ЧтениеJSON);
    КонецЕсли;
    

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

← На главную