При автоматизации загрузки данных из файлов Excel в 1С программисты часто используют механизм COM-объектов и технологию ADO (ActiveX Data Objects). Однако этот метод сильно зависит от окружения: версии операционной системы, установленных драйверов и обновлений безопасности Windows. Одной из самых коварных проблем является «Непредвиденная ошибка драйвера внешней базы данных (1)», которая часто возникает внезапно после обновления платформы или системы. Разберем подробно, почему возникает этот сбой и как его устранить несколькими способами.
Традиционно для работы с файлами формата .xls (старый формат Excel 97-2003) использовался провайдер Microsoft.Jet.OLEDB.4.0. Проанализируем ситуацию: этот драйвер является 32-битным компонентом, который Microsoft перестала активно развивать. В октябре 2017 года вышли патчи безопасности Windows, которые нарушили работу Jet 4.0 при обращении к файлам из приложений сторонних разработчиков, к которым относится и 1С. Если вы столкнулись с ошибкой (1), скорее всего, ваша система либо получила эти обновления, либо использует устаревший метод подключения к современным файлам .xlsx.
Рассмотрим более современную альтернативу — драйвер 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-битная версия драйвера.
Проанализируем ситуацию, когда обработка должна работать на разных компьютерах с разными версиями установленного 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.";
КонецПопытки;
КонецПопытки;
КонецФункции
Такой подход позволяет программе быть гибкой и автоматически адаптироваться под установленное ПО на конкретном рабочем месте пользователя или сервере.
Если ваша инфраструктура жестко завязана на драйвер Jet 4.0 и вы не можете оперативно изменить код или установить ACE, придется обратить внимание на системные обновления. Как показывает практика, ошибка (1) часто лечится удалением или, наоборот, установкой исправленных патчей. Проанализируем список обновлений, которые вызывали данную проблему:
Рекомендация: Вместо удаления обновлений (что небезопасно), рассмотрите установку накопительных обновлений Windows более поздних версий, где Microsoft выпустила исправление для самого движка Jet. Однако наиболее стабильным решением остается переход на другие методы чтения файлов.
Выясним, можно ли вообще обойтись без ADODB и установленных драйверов. Начиная с версии платформы 8.3.6, в 1С появился мощный встроенный механизм чтения файлов Excel. Посмотрим на пример кода, который работает значительно быстрее и стабильнее COM-соединений:
ТабДок = Новый ТабличныйДокумент;
Попытка
// Метод позволяет читать как XLS, так и XLSX напрямую
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Теперь мы можем обходить ячейки как в обычной таблице 1С
Для Строка = 1 По ТабДок.ВысотаТаблицы Цикл
ТекЗначение = ТабДок.Область(Строка, 1).Текст;
// Обработка данных...
КонецЦикла;
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
Разберем преимущества этого способа:
во-первых, он не требует наличия установленного Microsoft Excel на сервере или клиенте.
Во-вторых, он не зависит от драйверов Jet или ACE.
В-третьих, он кроссплатформенный и будет работать даже на серверах под управлением Linux.
Если вы все же решили использовать ADODB.Connection на стороне сервера, важно помнить о «невидимых» препятствиях. Проанализируем ситуацию: сервер 1С обычно работает под технической учетной записью (например, USR1CV8). У этой учетной записи могут отсутствовать необходимые папки профиля, которые требуются драйверам для создания временных файлов.
Проверьте наличие следующих каталогов (создайте их вручную, если они отсутствуют):
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных ОС)Без этих папок драйвер Microsoft JET Database Engine может выдавать «непредвиденную ошибку» просто потому, что не может инициализировать рабочую среду под системной учетной записью.
Резюме: Ошибка драйвера (1) — это сигнал к тому, что технология ADO/Jet устарела. Для оперативного решения используйте переход на провайдер ACE.OLEDB.12.0, а для стратегического — переводите свои обработки на встроенный метод ТабличныйДокумент.Прочитать(). Это избавит вас от зависимости от обновлений Windows и упростит поддержку системы.