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

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

При автоматизации загрузки данных из файлов Excel в 1С программисты часто используют механизм COM-объектов и технологию ADO (ActiveX Data Objects). Однако этот метод сильно зависит от окружения: версии операционной системы, установленных драйверов и обновлений безопасности Windows. Одной из самых коварных проблем является «Непредвиденная ошибка драйвера внешней базы данных (1)», которая часто возникает внезапно после обновления платформы или системы. Разберем подробно, почему возникает этот сбой и как его устранить несколькими способами.

Выясняем причины ошибки драйвера Jet

Традиционно для работы с файлами формата .xls (старый формат Excel 97-2003) использовался провайдер Microsoft.Jet.OLEDB.4.0. Проанализируем ситуацию: этот драйвер является 32-битным компонентом, который Microsoft перестала активно развивать. В октябре 2017 года вышли патчи безопасности Windows, которые нарушили работу Jet 4.0 при обращении к файлам из приложений сторонних разработчиков, к которым относится и 1С. Если вы столкнулись с ошибкой (1), скорее всего, ваша система либо получила эти обновления, либо использует устаревший метод подключения к современным файлам .xlsx.

Способ 1: Переход на провайдер Microsoft ACE OLEDB

Рассмотрим более современную альтернативу — драйвер Microsoft Access Database Engine (ACE). В отличие от старого Jet, провайдер ACE.OLEDB поддерживает как старые форматы .xls, так и новые .xlsx. Рассмотрим пример настройки строки подключения с использованием этого провайдера:


Connection = Новый COMОбъект("ADODB.Connection");
// Используем провайдер ACE версии 12.0
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + ПутьКФайлу + "; 
                    |Extended Properties=""Excel 12.0; HDR=No; IMEX=1"";";
Попытка
    Connection.Open(СтрокаПодключения);
    // Дальнейшая работа с набором записей
Исключение
    Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;

Важный нюанс: Если на компьютере не установлен пакет AccessDatabaseEngine.exe, вы получите ошибку «Поставщик не найден». В этом случае необходимо скачать и установить соответствующий дистрибутив с сайта Microsoft. Обратите внимание на разрядность: если ваш сервер 1С (или клиент) является 64-битным, вам потребуется 64-битная версия драйвера.

Способ 2: Создание универсальной функции подключения

Проанализируем ситуацию, когда обработка должна работать на разных компьютерах с разными версиями установленного Office. В этом случае лучше всего реализовать перебор возможных строк подключения. Разберем по шагам, как написать универсальный механизм, который будет пробовать разные провайдеры один за другим:


Функция ПолучитьКоннектExcel(пИмяФайла) Экспорт
    лРез = Новый COMОбъект("ADODB.Connection");
    
    // Вариант 1: Современный ACE для XLSX
    СтрокаACE = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + пИмяФайла + "; Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
    
    // Вариант 2: Jet для старых форматов
    СтрокаJet = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + пИмяФайла + "; Extended Properties=""Excel 8.0;HDR=No;IMEX=1;""";
    
    Попытка
        лРез.Open(СтрокаACE);
        Возврат лРез;
    Исключение
        // Если ACE не помог, пробуем Jet
        Попытка
            лРез.Open(СтрокаJet);
            Возврат лРез;
        Исключение
            // Если ничего не помогло, информируем пользователя
            ВызватьИсключение "Не удалось найти подходящий драйвер для загрузки Excel.";
        КонецПопытки;
    КонецПопытки;
КонецФункции

Такой подход позволяет программе быть гибкой и автоматически адаптироваться под установленное ПО на конкретном рабочем месте пользователя или сервере.

Способ 3: Работа с обновлениями Windows

Если ваша инфраструктура жестко завязана на драйвер Jet 4.0 и вы не можете оперативно изменить код или установить ACE, придется обратить внимание на системные обновления. Как показывает практика, ошибка (1) часто лечится удалением или, наоборот, установкой исправленных патчей. Проанализируем список обновлений, которые вызывали данную проблему:

  1. KB4041691 и KB4041681 — одни из первых патчей, вызвавших массовые сбои в октябре 2017 года.
  2. KB4041686 — также упоминается пользователями как причина блокировки драйверов внешней БД.
  3. KB4042007 — специфическое обновление для Windows Server 2008.

Рекомендация: Вместо удаления обновлений (что небезопасно), рассмотрите установку накопительных обновлений Windows более поздних версий, где Microsoft выпустила исправление для самого движка Jet. Однако наиболее стабильным решением остается переход на другие методы чтения файлов.

Способ 4: Использование метода «ТабличныйДокумент.Прочитать()»

Выясним, можно ли вообще обойтись без ADODB и установленных драйверов. Начиная с версии платформы 8.3.6, в 1С появился мощный встроенный механизм чтения файлов Excel. Посмотрим на пример кода, который работает значительно быстрее и стабильнее COM-соединений:


ТабДок = Новый ТабличныйДокумент;
Попытка
    // Метод позволяет читать как XLS, так и XLSX напрямую
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    // Теперь мы можем обходить ячейки как в обычной таблице 1С
    Для Строка = 1 По ТабДок.ВысотаТаблицы Цикл
        ТекЗначение = ТабДок.Область(Строка, 1).Текст;
        // Обработка данных...
    КонецЦикла;
Исключение
    Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;

Разберем преимущества этого способа: во-первых, он не требует наличия установленного Microsoft Excel на сервере или клиенте. Во-вторых, он не зависит от драйверов Jet или ACE. В-третьих, он кроссплатформенный и будет работать даже на серверах под управлением Linux.

Тонкости настройки прав и разрядности

Если вы все же решили использовать ADODB.Connection на стороне сервера, важно помнить о «невидимых» препятствиях. Проанализируем ситуацию: сервер 1С обычно работает под технической учетной записью (например, USR1CV8). У этой учетной записи могут отсутствовать необходимые папки профиля, которые требуются драйверам для создания временных файлов.

Проверьте наличие следующих каталогов (создайте их вручную, если они отсутствуют):

Без этих папок драйвер Microsoft JET Database Engine может выдавать «непредвиденную ошибку» просто потому, что не может инициализировать рабочую среду под системной учетной записью.

Резюме: Ошибка драйвера (1) — это сигнал к тому, что технология ADO/Jet устарела. Для оперативного решения используйте переход на провайдер ACE.OLEDB.12.0, а для стратегического — переводите свои обработки на встроенный метод ТабличныйДокумент.Прочитать(). Это избавит вас от зависимости от обновлений Windows и упростит поддержку системы.

← На главную