При организации обмена данными между информационными базами 1С через COM-соединение разработчики нередко сталкиваются с ситуацией, когда на рабочей станции или сервере установлено несколько различных версий платформы 1С:Предприятие. В таких условиях стандартный вызов объекта COM может завершиться аварийно с одной из двух ошибок: «Несоответствие версий клиента и сервера 1С:Предприятия» либо «Класс не зарегистрирован (0x80040154)». Разберем детально, почему это происходит и как правильно настроить окружение для стабильной работы обмена.
Посмотрим на типовой программный код, который инициирует внешнее подключение к информационной базе:
&НаСервере
Функция ПодключитьсяКCOMБазе(СтрокаИнициализации) Экспорт
db = Новый COMОбъект("V83.ComConnector");
V8 = db.Connect(СтрокаИнициализации);
Возврат V8;
КонецФункции
При выполнении этого кода система обращается к системному реестру Windows по программному идентификатору V83.ComConnector. Выясним причину возникающих сбоев:
V83.COMConnector. Платформа 1С не создает версионных идентификаторов для промежуточных релизов. При установке нового релиза путь к библиотеке comcntr.dll в реестре автоматически перезаписывается на последнюю установленную версию. Если серверная база работает на платформе 8.3.8, а в реестре зарегистрирован коннектор от 8.3.10, метод Connect вернет ошибку несоответствия версий.-2147221164 (0x80040154): Класс не зарегистрирован чаще всего возникает при несовпадении битности вызывающего процесса и зарегистрированной библиотеки. Библиотека comcntr.dll является внутрипроцессным COM-сервером (in-process server) и загружается прямо в адресное пространство процесса. Если 64-битный клиент или рабочий процесс сервера 1С пытается вызвать 32-битный COM-коннектор (или наоборот), Windows сообщает, что подходящий класс не зарегистрирован.HKEY_CLASSES_ROOT.Рассмотрим самый быстрый способ восстановления работоспособности обмена. Если на машине установлены разные платформы, зарегистрируем библиотеку той версии, которая точно совпадает с версией целевой базы (в нашем примере — 8.3.8.1964).
Разберем по шагам правильный вызов утилиты с учетом разрядности операционной системы и платформы:
%SystemRoot%\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.8.1964\bin\comcntr.dll"
%SystemRoot%\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.8.1964\bin\comcntr.dll"
После выполнения команды появится уведомление об успешной регистрации. Теперь вызов Новый COMОбъект("V83.ComConnector") будет инициализировать именно ту версию, которая установлена на сервере.
Рассмотрим более надежный и профессиональный метод, если на одном компьютере требуется поддерживать одновременную работу с базами разных релизов или устранить конфликт разрядностей 32 и 64 бит. Оформим библиотеку как серверное приложение COM+ через оснастку «Службы компонентов» (dcomcnfg):
dcomcnfg и нажмем Enter).1Cv8_8.3.8.1964).dllhost.exe.comcntr.dll требуемой версии (каталог bin нужного релиза).Такой подход изолирует компонент от вызовов операционной системы, снимает проблему конфликта разрядности 32/64 бит и исключает перезапись связей при автоматическом обновлении платформы.
Если нет возможности настроить COM+, а обмен выполняется по расписанию (например, через ночные скрипты), применим регистрацию в «тихом» режиме. Напишем bat-файл, выполняющий перерегистрацию перед стартом рабочего процесса:
rem Регистрация библиотеки нужного релиза перед выполнением обмена
regsvr32 /s "C:\Program Files (x86)\1cv8\8.3.8.1964\bin\comcntr.dll"
Параметр /s отключает всплывающие диалоговые окна Windows, что позволяет автоматизировать процесс.
Проанализируем архитектурную сторону вопроса. Использование COM-соединения имеет ряд существенных недостатков: жесткая привязка к операционной системе Windows, зависимость от разрядности процессов, блокировки и утечки памяти. Платформа 1С:Предприятие 8.3 предлагает современные универсальные технологии взаимодействия:
Перевод интеграций на веб-сервисы или HTTP-сервисы позволяет полностью исключить зависимость версий клиента и сервера и обеспечивает бесперебойную работу при любых обновлениях платформы 1С.