Как исправить ошибку «Не удается найти указанного поставщика» при выгрузке из 1С в Excel через ADO?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При интеграции систем автоматизации с внешними файлами разработчики часто используют технологию 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. 64-битное приложение не может загружать в свою память 32-битные динамические библиотеки (DLL) драйверов и провайдеров OLE DB.
  2. 32-битное приложение, напротив, не может работать с 64-битными версиями драйверов.

Платформа 1С:Предприятие 7.7 является исключительно 32-битным приложением. Она без проблем находит установленные в системе 32-битные драйверы Microsoft.Jet.OLEDB.4.0 или Microsoft.ACE.OLEDB.12.0 (которые обычно инсталлируются вместе с 32-битным пакетом Microsoft Office). Когда же мы запускаем 64-битную версию платформы 1С:Предприятие 8, она обращается к операционной системе с запросом на предоставление 64-битного провайдера ADO. Если такого провайдера в системе нет, Windows возвращает ошибку: «Не удается найти указанного поставщика».

Ниже мы подробно разберем четыре практических метода устранения этой проблемы.

Решение 1. Использование 32-разрядного клиента 1С (самый простой способ)

Если на компьютере пользователя установлен 32-битный пакет Microsoft Office (Excel), в системе гарантированно присутствуют работоспособные 32-битные драйверы ADO. Самый быстрый способ вернуть работоспособность выгрузке — запустить клиентское приложение 1С:Предприятие в 32-разрядном режиме.

Обратите внимание, что на одном компьютере могут бесконфликтно сосуществовать обе версии платформы 1С:Предприятие — и 32-битная, и 64-битная. Чтобы принудительно запустить базу под нужной разрядностью, выполните следующие шаги:

  1. Откройте окно запуска 1С:Предприятия.
  2. Выберите нужную информационную базу и нажмите кнопку «Изменить».
  3. Перейдите на последнюю вкладку параметров запуска.
  4. В поле «Разрядность» принудительно укажите значение «32 (x86)» вместо «Выбирать автоматически».
  5. Сохраните изменения и запустите сеанс.

После этого ваше приложение 1С станет 32-битным процессом и сможет успешно инициализировать установленный в системе OLE DB провайдер.

Решение 2. Обход ограничений и установка x64 драйвера ACE

Что делать, если база должна работать исключительно в 64-разрядном клиенте 1С (или выгрузка выполняется в фоновом задании на 64-битном сервере приложений 1С), но при этом на сервере/компьютере уже установлен 32-битный пакет MS Office? При попытке установить стандартный пакет Microsoft Access Database Engine (x64) установщик выдаст ошибку совместимости и прервет операцию.

Мы можем обойти это ограничение корпорации Microsoft с помощью командной строки. Давайте разберем этот процесс по шагам:

  1. Скачайте дистрибутив драйверов Microsoft Access Database Engine (x64) с официального сайта Microsoft.
  2. Запустите командную строку Windows (cmd) обязательно от имени администратора.
  3. Выполните команду установки файла, добавив специальный технологический ключ /passive (или /quiet в зависимости от версии установщика). Например: C:\PathToFolder\AccessDatabaseEngine_X64.exe /passive Этот ключ отключает интерактивный режим установки и игнорирует проверку на наличие конфликтующих версий Office.
  4. Важно: После такой "принудительной" установки может возникнуть конфликт библиотек mso.dll при запуске классических программ MS Office (Word, Excel). Чтобы решить эту проблему, откройте редактор реестра (regedit) и перейдите по следующему пути:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Common\FilesPaths (или ветка 15.0 / 16.0 в зависимости от установленной версии Access Database Engine).

    Найдите там строковый параметр mso.dll и переименуйте его или удалите. Это восстановит стабильную работу офисных приложений.

Решение 3. Использование службы компонентов COM+ (системный мост)

Если вы не хотите устанавливать неофициальные пакеты или ломать реестр Windows, существует штатный архитектурный способ решения проблемы взаимодействия разноразрядных приложений — создание суррогатного COM-сервера с помощью утилиты Службы компонентов Windows (Component Services).

Этот метод позволяет запускать 32-битный OLE DB провайдер внутри специального системного процесса dllhost.exe, а 64-битное приложение 1С сможет безопасно обращаться к нему через этот "мост".

Рассмотрим по шагам настройку службы компонентов:

  1. Нажмите комбинацию клавиш Win + R, введите команду dcomcnfg и нажмите Enter.
  2. В открывшемся окне перейдите по пути: Службы компонентов — Компьютеры — Мой компьютер — Приложения COM+.
  3. Нажмите правой кнопкой мыши на ветку «Приложения COM+» и выберите Создать — Приложение.
  4. В мастере создания выберите «Создать новое приложение», укажите понятное имя (например, Excel_ADO_Bridge) и обязательно выберите тип активации: «Приложение-сервер».
  5. На вкладке «Удостоверение» укажите учетную запись, под которой будет работать служба (для локального использования подойдет учетная запись «Интерактивный пользователь» или «Системная учетная запись»).
  6. Зайдите в свойства созданного приложения, перейдите на вкладку «Локализация» (или «Безопасность» в зависимости от версии Windows) и разрешите выполнение вызовов.
  7. Внутри созданного приложения перейдите в ветку Компоненты. Нажмите правой кнопкой мыши — Создать — Компонент.
  8. Выберите пункт «Установка новых компонентов» и укажите путь к 32-битной библиотеке ADO (обычно это C:\Program Files (x86)\Common Files\System\ado\msado15.dll).

После этой настройки операционная система Windows сама возьмет на себя маршалинг (трансляцию) вызовов между вашим 64-битным процессом 1С и 32-битным OLE DB провайдером.

Решение 4. Отказ от ADO в пользу встроенных механизмов 1С (рекомендуемый метод)

Использование сторонних драйверов 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. Этот код будет работать одинаково надежно и быстро на любом сервере и клиентском месте.

← На главную