Как исправить ошибку «Класс не зарегистрирован» (0x80040154) при подключении к SQL через ADODB.Connection в 1С

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

При настройке интеграции 1С:Предприятия с внешними базами данных разработчики часто прибегают к использованию технологии COM и библиотек семейства ActiveX Data Objects (ADO). Это удобный способ напрямую выполнять SQL-запросы к сторонним базам данных (MS SQL Server, Access, Oracle). Однако при переносе работающего кода на новые компьютеры или при обновлении платформы вы можете столкнуться с системным сбоем: Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован.

В этой статье мы подробно проанализируем ситуацию, выясним глубинную причину возникновения этой ошибки, разберем особенности регистрации динамических библиотек в 64-битных версиях операционной системы Windows и рассмотрим по шагам несколько эффективных способов решения проблемы.

Выясняем причину: Конфликт разрядности платформы 1С и COM-объектов

Основная причина ошибки 0x80040154 — это несовместимость разрядности (битности) исполняемого процесса 1С и зарегистрированной в операционной системе библиотеки COM. Рассмотрим подробнее механизм этого конфликта:

Проанализируем практический пример. В старых версиях платформы (например, 1С 8.2) тонкие и толстые клиенты поставлялись исключительно в 32-битной архитектуре. При обращении к объекту ADODB.Connection платформа успешно находила зарегистрированную в системе 32-битную версию библиотеки ADO.

При переходе на платформу 1С 8.3 пользователи всё чаще запускают 64-разрядную версию клиента 1С. В этот момент 64-битный процесс 1cv8.exe пытается инициализировать COM-объект ADODB.Connection, обращаясь к соответствующим веткам системного реестра Windows. Если в операционной системе зарегистрирована только 32-битная версия ADO, или если регистрация 64-битной версии нарушена, операционная система возвращает ошибку «Класс не зарегистрирован».

Особенности размещения msado15.dll в 64-битных ОС Windows

В современных 64-разрядных операционных системах Windows сосуществуют две изолированные подсистемы для работы с COM. Главная библиотека ADO (файл msado15.dll) физически присутствует на жестком диске в двух экземплярах по разным путям:

  1. 32-битная версия библиотеки: расположена по пути C:\Program Files (x86)\Common Files\System\ado\msado15.dll.
  2. 64-битная версия библиотеки: расположена по пути C:\Program Files\Common Files\System\ado\msado15.dll.

Если на компьютере пользователя зарегистрирована только 32-битная версия (например, после установки старого ПО), то 64-битный клиент 1С не сможет с ней взаимодействовать. Нам необходимо принудительно выполнить корректную регистрацию библиотек.

Решение 1. Ручная регистрация 64-битной библиотеки ADO

Разберем по шагам, как зарегистрировать нужную версию библиотеки в операционной системе с помощью утилиты regsvr32.exe. Помните важный нюанс: в 64-битной Windows системная папка System32 отвечает за 64-разрядные утилиты, а папка SysWOW64 — за 32-разрядные.

Для регистрации выполним следующие действия:

  1. Откроем меню «Пуск», найдем командную строку (cmd.exe) и запустим ее обязательно от имени Администратора.
  2. Для регистрации 64-битной библиотеки ADO, необходимой для работы 64-битного клиента 1С, введем и выполним команду:
    C:\Windows\System32\regsvr32.exe "C:\Program Files\Common Files\System\ado\msado15.dll"
  3. Если на этом же компьютере планируется использовать и 32-битные клиенты 1С, дополнительно зарегистрируем 32-битную версию ADO командой:
    C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\Common Files\System\ado\msado15.dll"

После выполнения каждой команды на экране должно появиться диалоговое окно с подтверждением об успешной регистрации библиотеки в DllRegisterServer.

Решение 2. Устранение проблем совместимости в Windows 7 SP1

Если вы работаете на операционных системах Windows 7 Service Pack 1 или Windows Server 2008 R2 SP1, вы можете столкнуться со специфической ошибкой совместимости API, которую допустили разработчики Microsoft при выпуске обновлений. Даже при корректной физической регистрации файлов вызов COM-объекта может завершаться неудачно.

В этом случае необходимо скачать и установить официальный пакет исправлений от Microsoft под номером KB2517589 (известный как ADO API Reference backporting package). Это обновление восстанавливает совместимость интерфейсов ADO в системе.

Решение 3. Контроль разрядности драйверов СУБД (OLE DB и ODBC)

Зарегистрировать сам объект ADODB.Connection — это лишь первый шаг. Сразу после успешного создания объекта вызовом Новый COMОбъект программа перейдет к строке открытия соединения (метод Open). Здесь может возникнуть новая ошибка: Поставщик не найден. Возможно, он установлен неправильно.

Причиной вновь является разрядность драйвера СУБД, указанного в строке подключения:

Решение 4. Обход ограничений безопасного режима во внешних обработках

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

Чтобы разрешить создание COM-объектов, выполним следующие настройки:

  1. В коде регистрации внешней обработки в процедуре СведенияОВнешнейОбработке укажем, что обработка должна запускаться с отключенным безопасным режимом:
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
  2. Если база данных работает в клиент-серверном режиме, убедимся, что в кластере серверов 1С для данной информационной базы не настроены жесткие профили безопасности, блокирующие запуск COM-технологий.

Решение 5. Перенос выполнения на сторону сервера (Рекомендованный подход)

Попытки установить прямое подключение к SQL с клиентского компьютера — это серьезная архитектурная ошибка. Во-первых, вам придется устанавливать драйверы СУБД и регистрировать системные библиотеки ADO на каждой рабочей станции пользователей. Во-вторых, открытие портов SQL-сервера наружу для клиентских машин создает серьезную угрозу безопасности.

Наиболее правильным, надежным и безопасным решением является перенос всей логики интеграции на сторону сервера 1С (в контекст &НаСервере или &НаСервереБезКонтекста). В этом случае все манипуляции с библиотеками ADO и СУБД производятся централизованно на сервере приложений 1С.

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


&НаКлиенте
Процедура ВыполнитьИнтеграцию(Команда)
    
    // Передаем управление на сервер, чтобы не зависеть от окружения клиента
    Попытка
        ТаблицаДанных = ПолучитьДанныеИзВнешнейБДНаСервере();
        ПоказатьПредупреждение(, "Загружено строк: " + ТаблицаДанных.Количество());
    Исключение
        ПоказатьПредупреждение(, ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДанныеИзВнешнейБДНаСервере()
    
    // Подготавливаем таблицу значений для возврата данных на клиент
    ТаблицаРезультат = Новый ТаблицаЗначений;
    ТаблицаРезультат.Колонки.Добавить("Идентификатор");
    ТаблицаРезультат.Колонки.Добавить("Наименование");
    
    // Создаем COM-объект на сервере. 
    // На сервере 1С должна быть зарегистрирована 64-битная версия ADODB.Connection!
    Попытка
        Connection = Новый COMОбъект("ADODB.Connection");
    Исключение
        ЗаписатьВЖурналРегистрацииОшибку(ОписаниеОшибки());
        ВызватьИсключение "Не удалось инициализировать интерфейс ADO на сервере 1С. Проверьте регистрацию msado15.dll.";
    КонецПопытки;
    
    // Формируем строку подключения к MS SQL Server
    СтрокаПодключения = "Provider=MSOLEDBSQL;Data Source=SQL-SERVER;Initial Catalog=External_DB;User ID=sa;Password=MyStrongPassword;";
    
    Попытка
        Connection.Open(СтрокаПодключения);
    Исключение
        ЗаписатьВЖурналРегистрацииОшибку(ОписаниеОшибки());
        ВызватьИсключение "Ошибка соединения с внешним сервером SQL. Проверьте сетевую доступность.";
    КонецПопытки;
    
    // Создаем объект Recordset для чтения результатов запроса
    Recordset = Новый COMОбъект("ADODB.Recordset");
    ТекстЗапроса = "SELECT ID, Name FROM Spr_Items WHERE IsActive = 1";
    
    Попытка
        Recordset.Open(ТекстЗапроса, Connection);
        
        // Обходим строки выборки во внешнем цикле
        Пока НЕ Recordset.EOF Цикл
            НоваяСтрока = ТаблицаРезультат.Добавить();
            НоваяСтрока.Идентификатор = СокрЛП(Recordset.Fields("ID").Value);
            НоваяСтрока.Наименование  = СокрЛП(Recordset.Fields("Name").Value);
            Recordset.MoveNext();
        КонецЦикла;
        
    Исключение
        ЗаписатьВЖурналРегистрацииОшибку(ОписаниеОшибки());
    КонецПопытки;
    
    // Обязательно закрываем открытые COM-соединения для освобождения памяти
    Попытка
        Recordset.Close();
        Connection.Close();
    Исключение
        // Игнорируем возможные ошибки при повторном закрытии объектов
    КонецПопытки;
    
    Возврат ТаблицаРезультат;
    
КонецФункции

&НаСервереБезКонтекста
Процедура ЗаписатьВЖурналРегистрацииОшибку(ТекстОшибки)
    ЗаписьЖурналаРегистрации("ИнтеграцияSQL",
        УровеньЖурналаРегистрации.Ошибка,
        ,
        ,
        ТекстОшибки);
КонецПроцедуры

Альтернативный вариант: Использование 32-разрядного клиента 1С

Если специфика вашего проекта не позволяет перенести исполнение кода на сервер (например, при использовании файловой версии базы данных 1С на локальном компьютере пользователя), а тонкая настройка реестра Windows вызывает сложности, существует обходной путь.

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

← На главную