При настройке интеграции 1С:Предприятия с внешними базами данных разработчики часто прибегают к использованию технологии COM и библиотек семейства ActiveX Data Objects (ADO). Это удобный способ напрямую выполнять SQL-запросы к сторонним базам данных (MS SQL Server, Access, Oracle). Однако при переносе работающего кода на новые компьютеры или при обновлении платформы вы можете столкнуться с системным сбоем: Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован.
В этой статье мы подробно проанализируем ситуацию, выясним глубинную причину возникновения этой ошибки, разберем особенности регистрации динамических библиотек в 64-битных версиях операционной системы Windows и рассмотрим по шагам несколько эффективных способов решения проблемы.
Основная причина ошибки 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-битной версии нарушена, операционная система возвращает ошибку «Класс не зарегистрирован».
В современных 64-разрядных операционных системах Windows сосуществуют две изолированные подсистемы для работы с COM. Главная библиотека ADO (файл msado15.dll) физически присутствует на жестком диске в двух экземплярах по разным путям:
C:\Program Files (x86)\Common Files\System\ado\msado15.dll.C:\Program Files\Common Files\System\ado\msado15.dll.Если на компьютере пользователя зарегистрирована только 32-битная версия (например, после установки старого ПО), то 64-битный клиент 1С не сможет с ней взаимодействовать. Нам необходимо принудительно выполнить корректную регистрацию библиотек.
Разберем по шагам, как зарегистрировать нужную версию библиотеки в операционной системе с помощью утилиты regsvr32.exe. Помните важный нюанс: в 64-битной Windows системная папка System32 отвечает за 64-разрядные утилиты, а папка SysWOW64 — за 32-разрядные.
Для регистрации выполним следующие действия:
cmd.exe) и запустим ее обязательно от имени Администратора.C:\Windows\System32\regsvr32.exe "C:\Program Files\Common Files\System\ado\msado15.dll"
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\Common Files\System\ado\msado15.dll"
После выполнения каждой команды на экране должно появиться диалоговое окно с подтверждением об успешной регистрации библиотеки в DllRegisterServer.
Если вы работаете на операционных системах Windows 7 Service Pack 1 или Windows Server 2008 R2 SP1, вы можете столкнуться со специфической ошибкой совместимости API, которую допустили разработчики Microsoft при выпуске обновлений. Даже при корректной физической регистрации файлов вызов COM-объекта может завершаться неудачно.
В этом случае необходимо скачать и установить официальный пакет исправлений от Microsoft под номером KB2517589 (известный как ADO API Reference backporting package). Это обновление восстанавливает совместимость интерфейсов ADO в системе.
Зарегистрировать сам объект ADODB.Connection — это лишь первый шаг. Сразу после успешного создания объекта вызовом Новый COMОбъект программа перейдет к строке открытия соединения (метод Open). Здесь может возникнуть новая ошибка: Поставщик не найден. Возможно, он установлен неправильно.
Причиной вновь является разрядность драйвера СУБД, указанного в строке подключения:
Microsoft.Jet.OLEDB.4.0 — существует исключительно в 32-битной версии. Запустить его в 64-битной 1С не получится. Вместо него следует установить 64-разрядный пакет Microsoft Access Database Engine и использовать провайдер Microsoft.ACE.OLEDB.12.0 или Microsoft.ACE.OLEDB.16.0.MSOLEDBSQL или классический SQLOLEDB).Начиная с версии 1С:Предприятия 8.3, механизмы безопасности платформы существенно ограничивают действия внешних отчетов и обработок. Если обработка запускается в безопасном режиме (например, при интеграции через подсистему «Дополнительные отчеты и обработки» БСП с настройками по умолчанию), вызов любых COM-объектов будет заблокирован самой платформой.
Чтобы разрешить создание COM-объектов, выполним следующие настройки:
СведенияОВнешнейОбработке укажем, что обработка должна запускаться с отключенным безопасным режимом:
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Попытки установить прямое подключение к 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",
УровеньЖурналаРегистрации.Ошибка,
,
,
ТекстОшибки);
КонецПроцедуры
Если специфика вашего проекта не позволяет перенести исполнение кода на сервер (например, при использовании файловой версии базы данных 1С на локальном компьютере пользователя), а тонкая настройка реестра Windows вызывает сложности, существует обходной путь.
Достаточно установить на рабочий ПК пользователя 32-разрядную версию клиентского приложения 1С:Предприятие 8.3. Она без проблем функционирует в среде 64-битных операционных систем Windows и автоматически обращается к 32-битным версиям драйверов и системных библиотек ADO, которые практически всегда установлены и настроены в системе по умолчанию.