При работе с внешними источниками данных через технологию ADO (ActiveX Data Objects) программисты 1С часто сталкиваются с ошибкой: «Произошла исключительная ситуация (ADOX.Catalog): Не удается найти указанный поставщик. Вероятно, он установлен неправильно». Эта проблема особенно актуальна при переходе на 64-битные операционные системы и серверные версии 1С. В данной статье мы подробно разберем причины возникновения этой ошибки, выясним, какие компоненты необходимо установить, и рассмотрим правильные способы настройки строк подключения.
Прежде чем приступать к установке драйверов, проанализируем важный технический нюанс. В среде Windows разрядность приложения (процесса) имеет решающее значение. Если ваш клиент 1С или сервер 1С запущен как 64-битный процесс, он физически не может использовать 32-битные драйверы (COM-объекты), и наоборот. Ошибка «Поставщик не найден» чаще всего означает, что в системе установлен драйвер одной разрядности, а 1С пытается вызвать его из процесса другой разрядности.
Рассмотрим ситуацию: у вас установлена 64-битная Windows 10 и 32-битный Microsoft Office. В этом случае стандартные драйверы Jet или ACE будут 32-битными. Если код выполняется «НаСервере» 64-битного сервера 1С, система выдаст ошибку, так как она не видит 64-битного провайдера данных.
Для работы с файлами Excel через ADO в 64-битной среде нам необходимо установить компонент Microsoft Access Database Engine. Выясним, какую версию выбрать:
AccessDatabaseEngine_X64.exe.Важное замечание по установке: часто 64-битный драйвер отказывается устанавливаться, если в системе уже стоит 32-битный Office. Чтобы обойти это ограничение, запустим установку через командную строку с параметром /quiet. Это позволит установить драйвер без конфликта с существующим пакетом Office.
Проанализируем примеры кода для создания подключения. Обратите внимание, что провайдеры для старых форматов (.xls) и новых (.xlsx) различаются. Разберем рабочий пример кода:
Если ВРег(Прав(ИмяФайла, 4)) = ".XLS" Тогда
// Используем старый провайдер Jet для файлов Excel 97-2003
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ИмяФайла + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";
Иначе
// Используем современный провайдер ACE для файлов Excel 2007 и выше
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ИмяФайла + ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;""";
КонецЕсли;
Catalog = Новый COMОбъект("ADOX.Catalog");
Попытка
Catalog.ActiveConnection = СтрокаПодключения;
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Если провайдер Microsoft.ACE.OLEDB.12.0 не определяется, попробуем указать версию 16.0, если у вас установлен Office 2016 или новее. Также в некоторых случаях помогает использование универсального драйвера ODBC. Посмотрим на пример такой строки:
СтрокаПодключения = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" + ИмяФайла + ";ReadOnly=1;";
Для работы с серверными базами MSSQL через ADO в 64-битной системе нам потребуются драйверы клиентского доступа. Рассмотрим основные варианты:
При использовании MSOLEDBSQL строка подключения в 1С будет выглядеть следующим образом:
СтрокаПодключения = "Provider=MSOLEDBSQL;Data Source=ИмяСервера;Initial Catalog=ИмяБазы;User ID=Логин;Password=Пароль;";
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open(СтрокаПодключения);
Если ошибка сохраняется, нам нужно проверить, какие именно поставщики зарегистрированы в системе. Разберем простой и эффективный способ проверки без написания кода 1С:
.txt на .udl.В этом списке вы увидите все драйверы OLE DB, доступные в вашей системе. Внимание: если вы запустите этот файл обычным способом, вы увидите 64-битных поставщиков. Чтобы проверить 32-битных поставщиков на 64-битной ОС, нужно запустить проверку через специальную команду в консоли, но для большинства задач 1С достаточно убедиться в наличии нужного провайдера в этом списке.
Иногда драйвер установлен, но COM-объект не может найти путь к библиотеке ACEOLEDB.DLL. В такой ситуации проанализируем состояние реестра. Если у вас 64-битная ОС и 32-битный офис, проверим ветку:
HKCR\Wow6432Node\CLSID\{3BE786A0-0366-9434-4F5C-25CF162E475E}\InprocServer32\
Значение по умолчанию должно указывать на актуальный путь к файлу драйвера, например: C:\Program Files (x86)\Common Files\Microsoft Shared\Office14\ACEOLEDB.DLL.
Если политика безопасности вашей организации или технические ограничения не позволяют устанавливать дополнительные компоненты, рассмотрим альтернативные методы работы с Excel, которые не требуют настройки ADO:
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.WorkBooks.Open(ИмяФайла);
Лист = Книга.Sheets(1);
Значение = Лист.Cells(1, 1).Value;
Excel.Quit();
ТабличныйДокумент.Прочитать() работает с файлами .xlsx напрямую, без драйверов и без установленного Excel, причем как на Windows, так и на Linux.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Подведем итог: для устранения ошибки ADO в первую очередь определите разрядность процесса 1С, выполняющего код. Установите соответствующий пакет Microsoft Access Database Engine (используя флаг /quiet при необходимости) и правильно сформируйте строку подключения, учитывая версию провайдера (Jet или ACE). Если задача позволяет, переходите на использование встроенных средств 1С для работы с файлами, что избавит вас от зависимости от системных драйверов.