Как прочитать Excel-файл на сервере 1С без установленного Microsoft Office?

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

При автоматизации бизнес-процессов часто возникает задача загрузки данных из файлов Microsoft Excel. Разработчики 1С нередко сталкиваются с ситуацией, когда код для чтения Excel-файла, прекрасно работающий на клиентском компьютере, наотрез отказывается выполняться на сервере. Как правило, это сопровождается ошибкой «Класс не зарегистрирован» при попытке создать COM-объект Excel.Application.

Давайте разберемся, почему так происходит и какие существуют надежные способы обойти эту проблему (например, универсальная загрузка из Excel "одним нажатием"). Основная причина ошибки заключается в том, что для работы объекта Excel.Application требуется установленный на машине пакет Microsoft Office, а устанавливать офисные приложения на сервер — плохая практика с точки зрения безопасности, лицензирования и потребления ресурсов. Рассмотрим несколько альтернативных и правильных подходов к решению этой задачи.

Решение 1: Использование технологии ADO и драйвера Microsoft Access Database Engine

Это самый распространенный и рекомендуемый способ для чтения данных из Excel-файлов на сервере, обеспечивающий импорт данных из различных форматов (*.xls, *.xlsx, *.csv и др.). Идея заключается в том, чтобы работать с Excel-файлом не как с документом приложения, а как с источником данных, похожим на базу данных. Для этого используется технология ActiveX Data Objects (ADO).

Проанализируем по шагам, что для этого нужно сделать:

  1. Установка драйвера. На сервер 1С необходимо установить специальный драйвер от Microsoft, который позволяет работать с файлами Office как с базами данных. Этот драйвер называется Microsoft Access Database Engine Redistributable. Он распространяется бесплатно.
    • Ключевой момент — это разрядность (битность). Необходимо установить драйвер той же разрядности, что и рабочий процесс сервера 1С (rphost.exe). Если у вас 64-битная операционная система, но 32-битный сервер 1С, вам нужно установить 32-битную (x86) версию драйвера. И наоборот.
    • Для современных файлов .xlsx (Excel 2007 и новее) используется провайдер Microsoft.ACE.OLEDB.12.0 (или 16.0 для более новых версий). Для старых файлов .xls (Excel 97-2003) можно использовать старый провайдер Microsoft.Jet.OLEDB.4.0.
  2. Формирование строки подключения. После установки драйвера в коде 1С необходимо сформировать специальную строку, которая укажет, как подключаться к файлу.

    Для файла .xlsx она выглядит так:

    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\MyFile.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=Yes;IMEX=1\";"

    Разберем ее ключевые параметры в секции Extended Properties:

    • Excel 12.0 Xml — указывает на формат современного файла Excel. Для старого формата .xls используется Excel 8.0.
    • HDR=Yes (или No) — очень важный параметр. HDR=Yes означает, что первая строка в вашем файле является строкой заголовков (Header). В этом случае драйвер будет использовать значения из этой строки в качестве имен полей (колонок). Если заголовков нет, укажите HDR=No.
    • IMEX=1 — критически важный параметр для избежания проблем со смешанными типами данных в столбцах. Он указывает драйверу работать в режиме импорта (IMport/EXport) и трактовать все данные в столбцах как текст. Это предотвращает ситуацию, когда числа в столбце читаются корректно, а следующие за ними текстовые значения в том же столбце превращаются в NULL.
  3. Написание кода 1С. В коде мы используем COM-объекты ADODB.Connection для установки соединения и ADODB.Recordset для выполнения SQL-запроса и получения данных.

Посмотрим на готовый пример кода:

Эта функция принимает полный путь к файлу и возвращает готовую ТаблицуЗначений. Также вы можете использовать этот шаблон простой обработки загрузки из excel в своих проектах.


&НаСервере
Функция ПрочитатьExcelЧерезADO(ПолныйПутьКФайлу)
    
    Перем ТаблицаРезультат;
    
    Попытка
        // 1. Создаем COM-объект для подключения к источнику данных
        Соединение = Новый COMОбъект("ADODB.Connection");
        
        // 2. Формируем строку подключения
        СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;"
                          + "Data Source=" + ПолныйПутьКФайлу + ";"
                          + "Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1"";";
        
        // 3. Открываем соединение
        Соединение.Open(СтрокаПодключения);
        
        // 4. Формируем текст SQL-запроса для чтения данных с листа
        // Обратите внимание: имя листа должно быть заключено в квадратные скобки,
        // а в конце должен стоять знак доллара '$'
        ИмяЛиста = "Лист1"; // Замените на имя вашего листа
        ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";
        
        // 5. Создаем COM-объект для хранения результата запроса
        НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
        НаборЗаписей.Open(ТекстЗапроса, Соединение);
        
        // 6. Создаем таблицу значений для загрузки данных в 1С
        ТаблицаРезультат = Новый ТаблицаЗначений;
        
        // 7. Динамически создаем колонки в таблице на основе заголовков из Excel
        Для ИндексКолонки = 0 По НаборЗаписей.Fields.Count - 1 Цикл
            ИмяКолонки = НаборЗаписей.Fields(ИндексКолонки).Name;
            ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
        КонецЦикла;
        
        // 8. Перебираем все строки из набора записей и заполняем таблицу 1С
        Пока НЕ НаборЗаписей.EOF() Цикл
            НоваяСтрока = ТаблицаРезультат.Добавить();
            Для ИндексКолонки = 0 По ТаблицаРезультат.Колонки.Количество() - 1 Цикл
                НоваяСтрока[ИндексКолонки] = НаборЗаписей.Fields(ИндексКолонки).Value;
            КонецЦикла;
            // Переходим к следующей записи
            НаборЗаписей.MoveNext();
        КонецЦикла;
        
    Исключение
        Сообщить("Произошла ошибка при чтении файла Excel: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
    // 9. Обязательно закрываем соединение и освобождаем объекты
    Если НаборЗаписей <> Неопределено Тогда
        Если НаборЗаписей.State = 1 Тогда // 1 - adStateOpen
            НаборЗаписей.Close();
        КонецЕсли;
        НаборЗаписей = Неопределено;
    КонецЕсли;

    Если Соединение <> Неопределено Тогда
        Если Соединение.State = 1 Тогда // 1 - adStateOpen
            Соединение.Close();
        КонецЕсли;
        Соединение = Неопределено;
    КонецЕсли;
    
    Возврат ТаблицаРезультат;
    
КонецФункции

Решение 2: Использование внешних компонент

Для более сложных задач, когда нужно не просто прочитать данные, а, например, работать с форматированием, формулами и картинками, возможностей ADO может не хватить. В этом случае на помощь приходят внешние компоненты — специализированные библиотеки, расширяющие функциональность 1С.

Можно выделить два основных типа таких компонент:

Этот путь сложнее в реализации, но незаменим для нетривиальных задач обработки Excel-документов.

Решение 3: Предварительная конвертация в текстовый формат (CSV)

Иногда самое простое решение — самое эффективное. Этот подход заключается в том, чтобы вообще избежать обработки сложного бинарного формата .xlsx на сервере.

Рассмотрим логику этого метода:

  1. Пользователь на своем компьютере, где установлен Excel, сохраняет нужный лист данных в простом текстовом формате, например, CSV (значения, разделенные запятыми или точкой с запятой).
  2. Полученный .csv файл передается на сервер 1С (например, через стандартный диалог выбора файла).
  3. Серверный код 1С считывает этот текстовый файл. Работа с текстовыми файлами в 1С реализована очень эффективно и не требует никаких внешних зависимостей. Файл читается построчно, и каждая строка разбирается на поля с помощью функции СтрРазделить().

Преимущества:

Недостатки:

В заключение, для большинства стандартных задач по загрузке данных из Excel на сервере метод с использованием ADO является "золотым стандартом". Он сочетает в себе простоту настройки и достаточную функциональность. Если же вам нужен полный контроль над документом, стоит изучить возможности внешних компонент. А для самых простых и контролируемых процессов импорта не стоит забывать о надежном методе с предварительной конвертацией в CSV.

← На главную