Как загрузить данные из Excel в 1С или конвертировать их в CSV без установленного Microsoft Office?

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

Нередко перед разработчиком встает задача загрузить данные из файлов формата XLS или XLSX в базу 1С на сервере или рабочем компьютере, где не установлен пакет Microsoft Office. Первым порывом часто бывает попытка предварительно перевести исходную таблицу в простой текстовый формат CSV. Разберем подробно, как решить эту задачу штатными инструментами платформы, а также проанализируем альтернативные способы конвертации и чтения данных.

Способ 1. Прямое чтение файлов Excel штатными средствами 1С (без конвертации)

Начиная с версии платформы 8.3.6, необходимость в промежуточной конвертации файлов Excel в формат CSV для последующей загрузки во многом отпала. Платформа 1С:Предприятие умеет открывать файлы XLS и XLSX напрямую без использования COM-объектов операционной системы и без установленного Microsoft Excel. Этот механизм одинаково работает как в среде Windows, так и на серверах под управлением Linux.

Для прямого чтения используется встроенный объект ТабличныйДокумент. Разберем по шагам алгоритм считывания данных из файла:

  1. Создаем новый экземпляр объекта ТабличныйДокумент.
  2. Вызываем метод Прочитать(), указав путь к файлу и способ открытия.
  3. Обходим ячейки документа по строкам и колонкам с помощью метода Область(), сразу помещая полученные значения в таблицу значений или справочник/документ информационной базы.

Посмотрим на пример загрузки данных из файла XLSX напрямую в 1С:


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

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

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

Важные нюансы платформенного чтения:

  1. Потребление оперативной памяти: при открытии больших файлов через ТабличныйДокумент в памяти создается структура документа со всеми стилями и форматированием. На очень больших таблицах (сотни тысяч строк) это может приводить к ошибкам нехватки памяти, особенно в 32-разрядных приложениях.
  2. Вычисляемые формулы: 1С считывает кэшированное значение результата формулы, сохраненное внутри файла. Если файл был сгенерирован сторонней программой, которая записала формулу без сохранения результата вычисления, значение ячейки может оказаться пустым.
  3. Файлы с паролем: встроенный механизм не сможет открыть защищенные паролем документы без предварительного снятия защиты.

Способ 2. Экспорт данных в CSV средствами платформы через объект ЗаписьCSV

Если для обмена или передачи на сторонние сервисы все же требуется именно формат CSV, сформировать его из прочитанного документа правильнее всего с помощью специализированного объекта ЗаписьCSV, а не через простую конкатенацию строк в ТекстовыйДокумент.

Объект ЗаписьCSV автоматически контролирует правила экранирования: заключает в кавычки текст, содержащий разделители или переносы строк, и удваивает внутренние кавычки. Рассмотрим пример выгрузки прочитанного табличного документа в файл CSV:


Запись = Новый ЗаписьCSV;
ПараметрыCSV = Новый ПараметрыЗаписиCSV(";", """", Символы.ВК + Символы.ПС, КодировкаТекста.UTF8);
Запись.ОткрытьФайл(ПутьКВыходномуФайлуCSV, ПараметрыCSV);

Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
    МассивЗначений = Новый Массив;
    Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
        МассивЗначений.Добавить(ТабДок.Область(НомерСтроки, НомерКолонки).Текст);
    КонецЦикла;
    Запись.ЗаписатьСтроку(МассивЗначений);
КонецЦикла;

Запись.Закрыть();

Способ 3. Использование бесплатных офисных пакетов (LibreOffice / OpenOffice)

Если требуется пакетная конвертация файлов сторонними средствами без написания сложных алгоритмов разбора, можно использовать бесплатные офисные пакеты, такие как LibreOffice или OpenOffice. Они поддерживают запуск из командной строки в безголовом режиме (headless), что позволяет вызывать их непосредственно из кода 1С через команду ЗапуститьПриложение().

Пример консольной команды, преобразующей файл XLSX в CSV с помощью LibreOffice:


libreoffice --headless --convert-to csv /путь/к/файлу.xlsx --outdir /папка/назначения/

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

Способ 4. Подключение через провайдеры OLE DB / ODBC (ADO)

Для файлов формата XLS и XLSX в операционных системах семейства Windows можно использовать подключение как к базе данных через технологию ADO с установленным драйвером Microsoft Access Database Engine (ACE.OLEDB). Это позволяет выполнять выборку данных с помощью привычных SQL-запросов (SELECT * FROM [Лист1$]) без установленного пакета Excel.

Однако этот метод имеет свои ограничения:

  1. Требуется строгая совместимость разрядности: если служба сервера 1С 64-битная, то и драйвер ACE OLEDB должен быть установлен в 64-битном варианте.
  2. Метод не является кроссплатформенным и не работает на серверах под управлением Linux.
  3. Возможны искажения типов данных, если в одной колонке Excel присутствуют как числовые, так и строковые ячейки (драйвер определяет тип колонки по первым нескольким строкам).

Способ 5. Внешние скрипты и потоковые конвертеры

Для обработки огромных объемов информации (файлы размером в сотни мегабайт), когда ТабличныйДокумент перегружает оперативную память сервера, эффективнее всего использовать внешние легковесные скрипты (например, на Python с библиотеками потокового чтения вроде openpyxl в режиме read_only) либо специализированные консольные утилиты. Они считывают данные построчно с минимальным потреблением ресурсов и формируют готовый CSV-файл, который затем быстро и стабильно загружается в 1С через ЧтениеCSV.

← На главную