При разработке интеграций и загрузке данных из файлов Microsoft Access (форматы .mdb и .accdb) разработчики часто сталкиваются с ошибкой «Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно» при вызове метода Open(). При этом тестовое подключение через файл с расширением .udl в проводнике может проходить успешно. Разберем детально, почему возникает эта неполадка и как корректно настроить соединение в среде 1С:Предприятия.
Проанализируем архитектуру используемых компонентов. Исторически популярный OLE DB провайдер Microsoft.Jet.OLEDB.4.0 разрабатывался исключительно как 32-битный (x86) компонент. В 64-битных версиях Windows 64-битной версии провайдера Jet.OLEDB.4.0 не существует в природе.
Когда исполняемый процесс платформы 1С запускается в 64-разрядном режиме (будь то тонкий/толстый клиент 1cv8.exe разрядности x64 или рабочий процесс сервера 1С rphost.exe), операционная система пытается обнаружить 64-битный COM-провайдер с указанным именем. Не найдя его в системном реестре для архитектуры x64, ADODB.Connection возвращает ошибку отсутствия поставщика данных.
Тест через файл .udl часто вводит в заблуждение: если запускать его в 64-битной Windows двойным кликом, по умолчанию может отрабатывать 32-битный диалог настройки OLE DB, где старый Jet-драйвер присутствует и успешно тестирует связь.
Рассмотрим основной и наиболее универсальный способ решения проблемы. Корпорация Microsoft выпустила пакет драйверов Microsoft Access Database Engine, содержащий провайдер Microsoft.ACE.OLEDB. Он существует как в 32-битной, так и в 64-битной редакциях, а также поддерживает работу как со старыми файлами .mdb, так и с современными .accdb.
Для реализации этого подхода выполним следующие действия:
Microsoft.Jet.OLEDB.4.0 на Microsoft.ACE.OLEDB.12.0 (или Microsoft.ACE.OLEDB.16.0 в зависимости от установленной версии пакета).Посмотрим на пример универсального кода подключения:
Соединение = Новый COMОбъект("ADODB.Connection");
ПутьКФайлу = "C:\Users\User\Documents\Export.mdb";
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Persist Security Info=False;";
Попытка
Соединение.Open(СтрокаПодключения);
Сообщить("Подключение к Access успешно установлено!");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Разберем частую системную проблему: если на компьютере пользователя уже установлен 32-разрядный пакет Microsoft Office (например, Word и Excel x86), штатный инсталлятор 64-битного Microsoft Access Database Engine откажется устанавливаться, выдав сообщение о несовместимости версий.
Чтобы обойти эту блокировку и установить 64-битный OLE DB провайдер параллельно с 32-битным Office, запустим установку из командной строки Windows (cmd) с ключом тихого режима:
AccessDatabaseEngine_X64.exe /passive
Параметр /passive позволяет зарегистрировать необходимые 64-битные библиотеки доступа к данным без конфликта с существующим офисным пакетом.
Если внешняя обработка или модуль интеграции распространяются среди пользователей с разным окружением (у одних установлен 32-битный клиент 1С, у других — 64-битный), определим архитектуру процесса динамически с помощью объекта СистемнаяИнформация.
Посмотрим, как организовать универсальный выбор строки соединения:
Инфо = Новый СистемнаяИнформация;
ТипПлатформы = Инфо.ТипПлатформы;
ПутьКБазе = "C:\Data\Export.mdb";
Соединение = Новый COMОбъект("ADODB.Connection");
Если ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
// 32-разрядный клиент может использовать как Jet, так и ACE
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ПутьКБазе + ";";
ИначеЕсли ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
// 64-разрядный клиент требует исключительно ACE
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКБазе + ";";
КонецЕсли;
Попытка
Соединение.Open(СтрокаПодключения);
Исключение
ВызватьИсключение "Не удалось подключиться к файлу Access. "
+ "Убедитесь, что установлены драйверы соответствующей разрядности ("
+ Строка(ТипПлатформы) + "). Текст ошибки: " + ОписаниеОшибки();
КонецПопытки;
Если OLE DB провайдер недоступен, подключимся к базе Access через системный драйвер ODBC без создания предварительного системного DSN (DSN-less connection). Разрядность драйвера ODBC также обязана совпадать с разрядностью исполняемого файла 1С.
Рассмотрим пример формирования ODBC-соединения через ADODB:
Соединение = Новый COMОбъект("ADODB.Connection");
ПутьКФайлу = "C:\Data\Export.mdb";
СтрокаПодключения = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + ПутьКФайлу + ";";
Попытка
Соединение.Open(СтрокаПодключения);
Сообщить("Соединение через ODBC успешно открыто.");
Исключение
Сообщить("Ошибка соединения через ODBC: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Проанализируем дополнительные факторы, способные вызывать сбои при открытии файла Access:
.ldb (или .laccdb). Фоновые процессы синхронизации облачных клиентов могут перехватывать монопольный доступ к файлам или блокировать создание временных файлов, вызывая ошибку открытия.C:\Users\User\... ведет к локальному диску сервера, а служба 1С (обычно работающая под учетной записью USR1CV8) не имеет прав доступа к пользовательским профилям.Для обеспечения надежной работы скопируем исходный файл во временную директорию перед подключением:
ВременныйФайл = КаталогВременныхФайлов() + "temp_import.mdb";
КопироватьФайл(ПутьКФайлуВОблаке, ВременныйФайл);
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ВременныйФайл + ";";
Соединение.Open(СтрокаПодключения);
// Выполняем чтение данных...
Соединение.Close();
УдалитьФайлы(ВременныйФайл);
Такой подход полностью изолирует операцию импорта от внешних блокировок файловой системы и облачных агентов.