При настройке обменов данными между базами 1С часто используется механизм COM-соединения. Однако при переходе на новые версии платформы или при смене архитектуры сервера (с x86 на x64) мы можем столкнуться с критической ошибкой при попытке инициализировать соединение. Рассмотрим ситуацию, когда конструктор Новый COMОбъект вызывает исключение с кодом ошибки -2147221005(0x800401F3): Недопустимая строка с указанием класса.
Эта ошибка однозначно указывает на то, что операционная система не может найти в реестре класс, соответствующий идентификатору V83.COMConnector, либо архитектура процесса, запрашивающего объект, не совпадает с архитектурой зарегистрированной библиотеки. Давайте разберем по шагам, как диагностировать и исправить эту проблему.
Прежде чем приступать к исправлению, давайте проанализируем, где именно исполняется наш код. Ошибка часто возникает в серверном коде, в то время как на клиенте тот же самый код может работать корректно.
Типичный код подключения выглядит так:
НовыйПодключенныйОбъект = Новый COMОбъект("V83.COMConnector");
Попытка
Enterprise = НовыйПодключенныйОбъект.Connect("Srvr=" + ИмяСервера + ";Ref=" + ИмяБазы + ";Usr=" + Пользователь + ";Pwd=" + Пароль + ";");
Исключение
Сообщить("Ошибка инициализации COM-объекта: " + ОписаниеОшибки());
КонецПопытки;
Если этот код выполняется в фоновом задании или на сервере 1С (x64), а библиотека comcntr.dll зарегистрирована только для 32-битных приложений (или наоборот), мы получим ошибку «Недопустимая строка с указанием класса». Серверное приложение 1С x64 не «видит» 32-битные COM-компоненты без специальной обертки.
Самое действенное решение, которое помогло автору вопроса и многим другим пользователям — это перерегистрация библиотеки comcntr.dll из командной строки. Важно делать это с правами администратора и учитывать разрядность операционной системы и сервера 1С.
Библиотека находится в папке bin установленной платформы 1С. Путь обычно выглядит так:
C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dllC:\Program Files (x86)\1cv8\8.3.XX.XXXX\bin\comcntr.dllДля регистрации используется утилита regsvr32. Обратите внимание на важный нюанс Windows x64:
C:\Windows\System32\regsvr32.exe — это 64-битная версия утилиты.C:\Windows\SysWOW64\regsvr32.exe — это 32-битная версия утилиты.Алгоритм действий для перерегистрации:
/u), чтобы очистить возможные «хвосты» в реестре.Пример команд для 64-битного сервера 1С:
rem Удаление регистрации (путь к вашей версии платформы)
regsvr32 /u "C:\Program Files\1cv8\8.3.13.1644\bin\comcntr.dll"
rem Регистрация
regsvr32 "C:\Program Files\1cv8\8.3.13.1644\bin\comcntr.dll"
Если у вас установлен 32-битный сервер 1С на 64-битной Windows, команды будут выглядеть так:
rem Используем SysWOW64 для 32-битной DLL
C:\Windows\SysWOW64\regsvr32 /u "C:\Program Files (x86)\1cv8\8.3.13.1644\bin\comcntr.dll"
C:\Windows\SysWOW64\regsvr32 "C:\Program Files (x86)\1cv8\8.3.13.1644\bin\comcntr.dll"
После выполнения команд обязательно перезапустите службу Агента сервера 1С:Предприятия, чтобы изменения вступили в силу.
Если простая регистрация не помогает, или если вам нужно использовать 32-битную компоненту на 64-битном сервере (или наоборот), нам необходимо создать «обертку» через Службу компонентов (COM+). Это позволяет вынести исполнение COM-объекта в отдельный процесс dllhost.exe.
Давайте выполним настройку:
Win + R, введите dcomcnfg и нажмите Enter.comcntr.dll нужной версии. Если у вас 64-битный сервер, но вы хотите стабильности, часто рекомендуют выбирать именно 64-битную DLL из папки C:\Program Files\1cv8\....После добавления компонента, зайдите в его свойства (правой кнопкой по появившемуся V83.COMConnector), перейдите на вкладку Безопасность и убедитесь, что в роли «CreatorOwner» стоят галочки разрешения.
Иногда ошибка 0x800401F3 маскирует проблему недостаточных прав. Пользователь, под которым работает серверный процесс 1С (часто это локальный USR1CV8), должен иметь полные права на чтение и выполнение в папке с библиотекой.
Давайте проверим это:
C:\Program Files\1cv8\8.3.XX.XXXX\bin\.comcntr.dll -> Свойства -> Безопасность.Также, если обмен происходит с файловой базой, этот же пользователь должен иметь полные права на папку с этой файловой базой.
В обсуждении была выявлена интересная особенность: в некоторых случаях на 64-разрядной ОС для корректной работы требуется наличие зарегистрированной 32-разрядной компоненты, даже если сервер 1С 64-битный.
Если стандартные методы не помогают, попробуйте следующий подход:
comcntr.dll именно из папки 32-битной платформы (Program Files (x86)) с помощью SysWOW64\regsvr32.Это может помочь системе корректно разрешать зависимости в реестре Windows, особенно если на сервере используются другие 32-битные OLE-объекты.
Библиотека comcntr.dll написана на C++ и зависит от системных библиотек Microsoft Visual C++ Redistributable. Если на сервере отсутствует нужная версия пакета (например, MSVC++ 2013 или 2015-2019, в зависимости от версии платформы 1С), регистрация библиотеки может пройти успешно, но создание объекта будет падать.
Рекомендуем обновить пакеты Visual C++ Redistributable (как x86, так и x64) до актуальных версий с сайта Microsoft.
Если восстановить работу COMConnector оперативно не удается, в качестве временного решения можно попробовать использовать OLE Automation (запуск полноценного приложения 1С, а не только DLL).
Замените строку инициализации:
// Вместо этого:
// НовыйПодключенныйОбъект = Новый COMОбъект("V83.COMConnector");
// Попробуйте использовать это:
НовыйПодключенныйОбъект = Новый COMОбъект("V83.Application");
Важно: V83.Application работает значительно медленнее, потребляет больше памяти и требует наличие пользовательской лицензии, но это поможет локализовать проблему. Если Application создается, а Connector нет — проблема 100% в регистрации DLL или правах на нее.