Как прочитать файл Excel в 1С x64 через ADODB и какие есть альтернативы?

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

При переходе на 64-разрядную платформу 1С:Предприятие разработчики часто сталкиваются с ошибками при попытке открыть файлы Excel через привычные механизмы ODBC или Jet OLEDB. Код, который годами стабильно работал в 32-разрядном клиенте или на сервере x86, начинает вызывать исключения вида «Заглушке переданы неправильные данные», «Не удается найти указанный поставщик» или сообщения о блокировке файла ядром Microsoft Jet.

Разберем детально, почему это происходит, как корректно настроить подключение через ADODB на 64-битной платформе и какие более простые и надежные альтернативы предоставляет встроенный язык 1С.

Причины сбоев при работе ADODB в 64-разрядной среде

Проанализируем природу проблемы, с которой сталкивается 64-разрядный процесс 1С:

  1. Отсутствие 64-разрядного драйвера Jet: Классический драйвер Microsoft Excel Driver (*.xls) и провайдер Microsoft.Jet.OLEDB.4.0 существуют исключительно в 32-битной реализации. Процесс 1cv8.exe или ragent.exe разрядности x64 физически не может загрузить 32-битные DLL-библиотеки в свое адресное пространство.
  2. Проблемы маршалинга через COM+: Попытка вынести 32-битный провайдер в службу компонентов COM+ через суррогатный процесс dllhost.exe нередко приводит к ошибке «Заглушке переданы неправильные данные». Низкоуровневые интерфейсы OLE DB сложно поддаются стандартной сериализации RPC между разрядностями.

Вариант 1. Использование провайдера Microsoft.ACE.OLEDB

Для прямого доступа к файлам Excel через ADODB в 64-битной системе необходимо использовать современный движок Microsoft Access Database Engine (ACE). Посмотрим, как выглядит универсальный код инициализации подключения:


Об_Конект = Новый COMОбъект("ADODB.Connection");
Стр_Подключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1;"";";

Попытка
    Об_Конект.Open(Стр_Подключения);
    Выборка = Новый COMОбъект("ADODB.Recordset");
    Выборка.Open("SELECT * FROM [Лист1$]", Об_Конект);
    
    Пока НЕ Выборка.EOF Цикл
        // Обработка данных строки
        Выборка.MoveNext();
    КонецЦикла;
    
    Выборка.Close();
    Об_Конект.Close();
Исключение
    Сообщить("Ошибка подключения к файлу Excel: " + ОписаниеОшибки());
КонецПопытки;

Разберем ключевые параметры строки подключения:

  1. Provider: Указываем Microsoft.ACE.OLEDB.12.0 (или Microsoft.ACE.OLEDB.16.0 для свежих версий Access Database Engine).
  2. Extended Properties: Этот параметр строго зависит от расширения файла:
    • Для .xls (Excel 97–2003): Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;"
    • Для .xlsx (OpenXML): Extended Properties="Excel 12.0 Xml;HDR=Yes;IMEX=1;"
    • Для .xlsm (с макросами): Extended Properties="Excel 12.0 Macro;HDR=Yes;IMEX=1;"
    • Для .xlsb (двоичный формат): Extended Properties="Excel 12.0;HDR=Yes;IMEX=1;"
  3. IMEX=1: Заставляет драйвер считывать данные смешанного типа как текст, что предотвращает появление пустых значений в колонках с разнородными данными.

Важный нюанс установки драйвера: Если на рабочем месте уже установлен 32-разрядный пакет Microsoft Office, стандартный инсталлятор 64-битного ACE OLEDB выдаст ошибку несовместимости. Чтобы обойти это ограничение, выполним установку драйвера через командную строку в тихом режиме:

AccessDatabaseEngine_X64.exe /quiet

Вариант 2. Автоматизация через COM-объект Excel.Application

Если на сервере или клиентской машине установлен пакет Microsoft Office соответствующей разрядности, мы можем использовать прямое обращение к объектной модели Excel. Этот способ более ресурсоемкий, но не требует составления SQL-запросов к листам книги.

Рассмотрим пример чтения книги через OLE-автоматизацию:


Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Excel.DisplayAlerts = Ложь;
    Excel.Visible = Ложь;
Исключение
    Сообщить("Не удалось инициализировать приложение Microsoft Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Попытка
    Книга = Excel.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Worksheets(1);
    
    // Получаем используемый диапазон данных
    ВсегоСтрок = Лист.UsedRange.Rows.Count;
    ВсегоКолонок = Лист.UsedRange.Columns.Count;
    
    Для НомерСтроки = 1 По ВсегоСтрок Цикл
        ЗначениеЯчейки = Лист.Cells(НомерСтроки, 1).Value;
        // Обработка данных
    КонецЦикла;
    
    Книга.Close(Ложь);
    Excel.Quit();
Исключение
    Сообщить("Ошибка при обработке книги Excel: " + ОписаниеОшибки());
    Если Excel <> Неопределено Тогда
        Excel.Quit();
    КонецЕсли;
КонецПопытки;

Вариант 3. Использование встроенного объекта ТабличныйДокумент (рекомендуемый)

Начиная с платформы 8.3.6, в 1С появился нативный механизм чтения файлов Excel форматов .xls и .xlsx напрямую через объект ТабличныйДокумент. Это полностью платформенное решение, которое одинаково быстро и стабильно работает в 32- и 64-битных клиентах, на сервере 1С под Windows и Linux, а также не требует установки Microsoft Office или сторонних OLE DB драйверов.

Посмотрим на реализацию загрузки файла через табличный документ:


ТабДок = Новый ТабличныйДокумент;

Попытка
    ТабДок.Прочитать(ПутьКФайлу);
Исключение
    Сообщить("Не удалось прочитать файл Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;

Для НомерСтроки = 1 По ВсегоСтрок Цикл
    // Читаем значения из нужных колонок
    КодТовара = ТабДок.Область(НомерСтроки, 1).Текст;
    Количество = ТабДок.Область(НомерСтроки, 2).Текст;
    
    // Выполняем бизнес-логику заполнения
КонецЦикла;

Выводы и рекомендации

Проанализировав все способы взаимодействия с Excel в 64-битной среде, сформулируем практические рекомендации:

  1. Для типовых задач загрузки и выгрузки прайс-листов, накладных и отчетов предпочтительно использовать метод ТабличныйДокумент.Прочитать() — он исключает зависимость от сторонних библиотек и COM-технологий.
  2. Если требуется выполнять сложные выборки или объединения листов с помощью языка SQL, установим 64-битный драйвер Microsoft.ACE.OLEDB в тихом режиме и настроим подключение через ADODB.Connection.
  3. Использование Excel.Application целесообразно оставлять только для сценариев со сложным форматированием, вызовом макросов VBA или специфической обработкой защищенных книг.
← На главную