При интеграции информационных баз 1С, работающих на разных версиях платформы, часто возникает задача настроить между ними обмен данными. Одним из самых распространенных инструментов для этого является COM-соединение. Однако именно здесь можно столкнуться со специфической ошибкой, которая на первый взгляд кажется нелогичной. Разберем ситуацию, когда при попытке подключения из более новой версии платформы (например, 8.3.17) к базе на более старой (8.3.16) система выдает исключение.
Проанализируем ситуацию: есть две базы. База-клиент работает на платформе 8.3.17, а база-источник, к которой нужно подключиться, — на 8.3.16. При выполнении кода на сервере базы-клиента возникает ошибка:
Произошла исключительная ситуация (V83.COMConnector.1): Несоответствие версий клиента и сервера 1С:Предприятия. Различаются версии клиента и сервера (8.3.17.1851 - 8.3.16.1063), клиентское приложение: COM-соединение.
Ошибка указывает, что версия "клиента" (8.3.17) не совпадает с версией "сервера" (8.3.16). Давайте выясним, что это означает и как это исправить.
Чтобы понять корень проблемы, посмотрим на типичный код для установки COM-соединения:
// Код выполняется на сервере с платформой 8.3.17
V83 = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1C"";Ref=""UT"";" +
"usr=""" + СокрЛП(Пользователь) + """;" +
"pwd=""" + СокрЛП(Пароль) + """;";
// На этой строке возникает ошибка
БазаИсточник = V83.Connect(СтрокаПодключения);
Ключевым моментом здесь является создание объекта V83.COMConnector. Когда вы вызываете Новый COMОбъект("V83.COMConnector"), операционная система находит в реестре соответствующую этому идентификатору (ProgID) COM-библиотеку comcntr.dll. Поскольку код выполняется на машине с установленной платформой 8.3.17, будет использована библиотека именно этой версии.
Далее, метод Connect использует эту библиотеку для установки соединения с сервером 1С, на котором расположена целевая база (работающая на 8.3.16). В этот момент сервер 1С проводит проверку: версия компонента, который пытается подключиться (в нашем случае это "клиентская" часть COM-соединения версии 8.3.17), должна строго совпадать с версией самого сервера (8.3.16). Поскольку версии не совпадают, соединение разрывается с критической ошибкой.
Попытка вручную зарегистрировать на сервере 8.3.17 библиотеку comcntr.dll от версии 8.3.16 командой regsvr32.exe обычно не помогает. Причина в том, что более новая установленная платформа (8.3.17) "перехватывает" регистрацию общего идентификатора V83.COMConnector, и система все равно использует новую библиотеку.
Теперь, когда причина ясна, рассмотрим варианты решения проблемы.
Это самый простой, надежный и правильный с точки зрения администрирования способ. Установите на обоих серверах (и на клиенте, и на источнике) одинаковую версию платформы 1С:Предприятие.
Преимущества:
Если у вас нет жестких ограничений, запрещающих обновление платформы на одном из серверов, всегда выбирайте этот путь. Это сэкономит вам массу времени и сил в будущем.
Если по каким-то причинам вы не можете использовать одну версию платформы (например, из-за требований к конфигурациям или другого ПО), существует обходной путь. Он заключается в том, чтобы "научить" операционную систему различать COM-коннекторы разных версий, дав им уникальные имена.
Этот метод требует прав администратора на сервере, где выполняется код подключения (в нашем примере — на сервере с платформой 8.3.17).
Рассмотрим по шагам:
Найдите их через "Панель управления" -> "Администрирование" или выполнив команду dcomcnfg.
В дереве консоли раскройте "Службы компонентов" -> "Компьютеры" -> "Мой компьютер" -> "Приложения COM+". Нажмите правой кнопкой мыши на "Приложения COM+" и выберите "Создать" -> "Приложение".
В мастере выберите "Создать новое приложение". Задайте ему понятное имя, например, 1C_Connector_8_3_16. Тип активации оставьте "Серверное приложение".
Раскройте ваше новое приложение (1C_Connector_8_3_16), нажмите правой кнопкой мыши на папку "Компоненты" и выберите "Создать" -> "Компонент".
В мастере выберите "Установка новых компонентов". Найдите и укажите путь к файлу comcntr.dll от нужной вам старой версии платформы. Например: C:\Program Files\1cv8\8.3.16.1063\bin\comcntr.dll. Завершите установку компонента.
Внутри папки "Компоненты" появится объект V83.COMConnector.1. Откройте его свойства, перейдите на вкладку "Активация" и в поле "ProgID" укажите новое, уникальное имя. Например, V83_16.COMConnector.
Если вам нужно подключаться и к базам на 8.3.17, и к базам на 8.3.16 с одного сервера, вы можете создать аналогичное приложение COM+ для версии 8.3.17 (например, 1C_Connector_8_3_17), добавив в него comcntr.dll из каталога bin платформы 8.3.17 и задав ProgID, например, V83_17.COMConnector.
Важно: После этих действий может потребоваться перезагрузка сервера или, как минимум, перезапуск службы "Приложения системы COM+".
Теперь в вашем коде вы можете явно указывать, какую версию коннектора использовать, обращаясь к нему по новому имени.
Посмотрим на пример измененного кода:
// Для подключения к базе на платформе 8.3.16
// Используем наш новый, зарегистрированный через COM+ коннектор
Попытка
V8_16 = Новый COMОбъект("V83_16.COMConnector");
Исключение
Сообщить("Не удалось создать COM-объект для платформы 8.3.16. Проверьте настройки COM+.");
Возврат;
КонецПопытки;
СтрокаПодключения = "Srvr=""Server1C"";Ref=""UT"";" +
"usr=""" + СокрЛП(Пользователь) + """;" +
"pwd=""" + СокрЛП(Пароль) + """;";
// Эта строка теперь выполнится без ошибки
БазаИсточник = V8_16.Connect(СтрокаПодключения);
Этот метод сложен в настройке, но он является единственным надежным способом обеспечить параллельную работу с базами на разных версиях платформ через COM-соединение с одного сервера. Для пошаговой настройки службы можно использовать руководство по запуску COM-объектов 1С разных версий в среде COM+.
Существует еще один, "варварский" метод, который заключается в программной перерегистрации нужной версии comcntr.dll прямо перед созданием COM-объекта.
Принцип действия:
comcntr.dll с помощью команды regsvr32.exe /u /s "путь_к_новой_dll".comcntr.dll с помощью команды regsvr32.exe /s "путь_к_старой_dll".Этот подход крайне не рекомендуется по нескольким причинам:
regsvr32.exe пользователь, от имени которого запущен сервер 1С (обычно USR1CV8), должен иметь права на изменение системного реестра. Это серьезное нарушение безопасности.Этот метод стоит рассматривать только в исключительных случаях, для разовых задач в монопольном режиме и при полном понимании всех рисков.