Как исправить ошибку «Не удается найти указанный поставщик» при подключении 1С к файлу Access через ADODB?

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

При разработке интеграций и загрузке данных из файлов 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-драйвер присутствует и успешно тестирует связь.

Решение 1. Переход на современный провайдер Microsoft.ACE.OLEDB

Рассмотрим основной и наиболее универсальный способ решения проблемы. Корпорация Microsoft выпустила пакет драйверов Microsoft Access Database Engine, содержащий провайдер Microsoft.ACE.OLEDB. Он существует как в 32-битной, так и в 64-битной редакциях, а также поддерживает работу как со старыми файлами .mdb, так и с современными .accdb.

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

  1. Скачаем и установим пакет Microsoft Access Database Engine (версии 2010, 2016 или актуальной версии) разрядности x64, соответствующей разрядности клиентского приложения или сервера 1С.
  2. Заменим устаревший провайдер 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 успешно установлено!");
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;

Решение 2. Обход конфликта разрядностей при установке Microsoft Office

Разберем частую системную проблему: если на компьютере пользователя уже установлен 32-разрядный пакет Microsoft Office (например, Word и Excel x86), штатный инсталлятор 64-битного Microsoft Access Database Engine откажется устанавливаться, выдав сообщение о несовместимости версий.

Чтобы обойти эту блокировку и установить 64-битный OLE DB провайдер параллельно с 32-битным Office, запустим установку из командной строки Windows (cmd) с ключом тихого режима:

AccessDatabaseEngine_X64.exe /passive

Параметр /passive позволяет зарегистрировать необходимые 64-битные библиотеки доступа к данным без конфликта с существующим офисным пакетом.

Решение 3. Программная адаптация строки подключения под разрядность клиента

Если внешняя обработка или модуль интеграции распространяются среди пользователей с разным окружением (у одних установлен 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. " 
        + "Убедитесь, что установлены драйверы соответствующей разрядности (" 
        + Строка(ТипПлатформы) + "). Текст ошибки: " + ОписаниеОшибки();
КонецПопытки;

Решение 4. Использование альтернативного подключения через ODBC

Если 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:

  1. Файлы в синхронизируемых каталогах (Dropbox, OneDrive, Яндекс.Диск): движок Microsoft Access при открытии базы пытается создать рядом файл блокировок с расширением .ldb (или .laccdb). Фоновые процессы синхронизации облачных клиентов могут перехватывать монопольный доступ к файлам или блокировать создание временных файлов, вызывая ошибку открытия.
  2. Исполнение на стороне сервера: если код выполняется на сервере 1С или в рамках фонового задания, путь C:\Users\User\... ведет к локальному диску сервера, а служба 1С (обычно работающая под учетной записью USR1CV8) не имеет прав доступа к пользовательским профилям.

Для обеспечения надежной работы скопируем исходный файл во временную директорию перед подключением:


ВременныйФайл = КаталогВременныхФайлов() + "temp_import.mdb";
КопироватьФайл(ПутьКФайлуВОблаке, ВременныйФайл);

СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ВременныйФайл + ";";
Соединение.Open(СтрокаПодключения);

// Выполняем чтение данных...

Соединение.Close();
УдалитьФайлы(ВременныйФайл);

Такой подход полностью изолирует операцию импорта от внешних блокировок файловой системы и облачных агентов.

← На главную