При интеграции систем автоматизации с внешними файлами разработчики часто используют технологию ADO (ActiveX Data Objects). Это проверенный временем и очень быстрый способ записи или чтения данных из файлов Microsoft Excel напрямую, без фактического запуска самого приложения Excel. Однако при переходе на новые операционные системы или при смене архитектуры платформы 1С:Предприятие разработчики сталкиваются с критической ошибкой: «Не удается найти указанного поставщика. Подключение может быть установлено неправильно».
В этой статье мы подробно разберем, почему возникает эта ошибка, как она связана с архитектурными особенностями Windows и разрядностью приложений, а также рассмотрим несколько эффективных способов решения проблемы — от простых организационных мер до продвинутых системных настроек и современных альтернативных методов выгрузки.
Давайте проанализируем ситуацию, описанную автором темы. На одном и том же компьютере выгрузка без проблем отрабатывает на платформе 1С:Предприятие 7.7, но выдает ошибку в 1С:Предприятие 8. При этом используются абсолютно идентичные строки подключения.
Рассмотрим стандартные строки подключения, которые применяются для работы с файлами Excel:
Вариант 1 (устаревший драйвер Jet для старых форматов XLS):
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ПолныйПутьКФайлу + ";Extended Properties=""Excel 8.0;HDR=No;"";";
Вариант 2 (более современный драйвер ACE для форматов XLSX и XLS):
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПолныйПутьКФайлу + ";Extended Properties=Excel 12.0 Xml;";
Причина сбоя кроется в разрядности запущенных процессов. Операционная система Windows разделяет адресные пространства 32-битных (x86) и 64-битных (x64) приложений:
Платформа 1С:Предприятие 7.7 является исключительно 32-битным приложением. Она без проблем находит установленные в системе 32-битные драйверы Microsoft.Jet.OLEDB.4.0 или Microsoft.ACE.OLEDB.12.0 (которые обычно инсталлируются вместе с 32-битным пакетом Microsoft Office). Когда же мы запускаем 64-битную версию платформы 1С:Предприятие 8, она обращается к операционной системе с запросом на предоставление 64-битного провайдера ADO. Если такого провайдера в системе нет, Windows возвращает ошибку: «Не удается найти указанного поставщика».
Ниже мы подробно разберем четыре практических метода устранения этой проблемы.
Если на компьютере пользователя установлен 32-битный пакет Microsoft Office (Excel), в системе гарантированно присутствуют работоспособные 32-битные драйверы ADO. Самый быстрый способ вернуть работоспособность выгрузке — запустить клиентское приложение 1С:Предприятие в 32-разрядном режиме.
Обратите внимание, что на одном компьютере могут бесконфликтно сосуществовать обе версии платформы 1С:Предприятие — и 32-битная, и 64-битная. Чтобы принудительно запустить базу под нужной разрядностью, выполните следующие шаги:
После этого ваше приложение 1С станет 32-битным процессом и сможет успешно инициализировать установленный в системе OLE DB провайдер.
Что делать, если база должна работать исключительно в 64-разрядном клиенте 1С (или выгрузка выполняется в фоновом задании на 64-битном сервере приложений 1С), но при этом на сервере/компьютере уже установлен 32-битный пакет MS Office? При попытке установить стандартный пакет Microsoft Access Database Engine (x64) установщик выдаст ошибку совместимости и прервет операцию.
Мы можем обойти это ограничение корпорации Microsoft с помощью командной строки. Давайте разберем этот процесс по шагам:
cmd) обязательно от имени администратора./passive (или /quiet в зависимости от версии установщика). Например:
C:\PathToFolder\AccessDatabaseEngine_X64.exe /passive
Этот ключ отключает интерактивный режим установки и игнорирует проверку на наличие конфликтующих версий Office.
mso.dll при запуске классических программ MS Office (Word, Excel). Чтобы решить эту проблему, откройте редактор реестра (regedit) и перейдите по следующему пути:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Common\FilesPaths (или ветка 15.0 / 16.0 в зависимости от установленной версии Access Database Engine).
Если вы не хотите устанавливать неофициальные пакеты или ломать реестр Windows, существует штатный архитектурный способ решения проблемы взаимодействия разноразрядных приложений — создание суррогатного COM-сервера с помощью утилиты Службы компонентов Windows (Component Services).
Этот метод позволяет запускать 32-битный OLE DB провайдер внутри специального системного процесса dllhost.exe, а 64-битное приложение 1С сможет безопасно обращаться к нему через этот "мост".
Рассмотрим по шагам настройку службы компонентов:
Win + R, введите команду dcomcnfg и нажмите Enter.Excel_ADO_Bridge) и обязательно выберите тип активации: «Приложение-сервер».C:\Program Files (x86)\Common Files\System\ado\msado15.dll).После этой настройки операционная система Windows сама возьмет на себя маршалинг (трансляцию) вызовов между вашим 64-битным процессом 1С и 32-битным OLE DB провайдером.
Использование сторонних драйверов Microsoft Jet и ACE накладывает серьезные технологические ограничения: этот код привязан исключительно к операционной системе Windows, требует сложной аддоно-настройки на каждом сервере и накладывает ограничения на масштабируемость системы.
Современные версии платформы 1С:Предприятие 8 имеют мощный встроенный механизм для работы с файлами XLSX. Он работает полностью автономно, не требует наличия Microsoft Office, отлично функционирует как под управлением Windows, так и на серверах под управлением Linux, и не зависит от разрядности платформы.
Давайте проанализируем, как можно быстро переписать код выгрузки, используя объект ТабличныйДокумент. Вместо построчного добавления записей через ADO-подключение, мы можем сформировать документ стандартным образом и сохранить его одной строчкой кода.
Посмотрим на пример практической реализации:
&НаСервере
Процедура ВыгрузитьДанныеВExcelНативно(ПолныйПутьКФайлу, ТаблицаДанных)
// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
// Определим базовый шрифт для выгрузки
ШрифтТекста = Новый Шрифт("Arial", 10);
ШрифтШапки = Новый Шрифт("Arial", 10, Истина);
// Формируем шапку таблицы
ТекущаяСтрока = 1;
Для НомерКолонки = 1 По ТаблицаДанных.Колонки.Количество() Цикл
ИмяКолонки = ТаблицаДанных.Колонки[НомерКолонки - 1].Имя;
ОбластьШапки = ТабДок.Область(ТекущаяСтрока, НомерКолонки);
ОбластьШапки.Текст = ИмяКолонки;
ОбластьШапки.Шрифт = ШрифтШапки;
ОбластьШапки.ЦветФона = WebЦвета.СветлоСерый;
КонецЦикла;
// Заполняем табличный документ строками данных
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
ТекущаяСтрока = ТекущаяСтрока + 1;
Для НомерКолонки = 1 По ТаблицаДанных.Колонки.Количество() Цикл
ЗначениеЯчейки = СтрокаДанных[НомерКолонки - 1];
ОбластьЯчейки = ТабДок.Область(ТекущаяСтрока, НомерКолонки);
ОбластьЯчейки.Текст = Строка(ЗначениеЯчейки);
ОбластьЯчейки.Шрифт = ШрифтТекста;
КонецЦикла;
КонецЦикла;
// Сохраняем готовый документ в формате Excel 2007+ (XLSX)
Попытка
ТабДок.Записать(ПолныйПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Выгрузка успешно завершена в файл: " + ПолныйПутьКФайлу);
Исключение
ВызватьИсключение "Не удалось сохранить файл Excel. Ошибка: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Используя данный метод, мы полностью избавляем себя от необходимости разбираться с разрядностью операционной системы, устанавливать дополнительные библиотеки и настраивать права доступа к службам компонентов Windows. Этот код будет работать одинаково надежно и быстро на любом сервере и клиентском месте.