Нередко перед разработчиком встает задача загрузить данные из файлов формата XLS или XLSX в базу 1С на сервере или рабочем компьютере, где не установлен пакет Microsoft Office. Первым порывом часто бывает попытка предварительно перевести исходную таблицу в простой текстовый формат CSV. Разберем подробно, как решить эту задачу штатными инструментами платформы, а также проанализируем альтернативные способы конвертации и чтения данных.
Начиная с версии платформы 8.3.6, необходимость в промежуточной конвертации файлов Excel в формат CSV для последующей загрузки во многом отпала. Платформа 1С:Предприятие умеет открывать файлы XLS и XLSX напрямую без использования COM-объектов операционной системы и без установленного Microsoft Excel. Этот механизм одинаково работает как в среде Windows, так и на серверах под управлением Linux.
Для прямого чтения используется встроенный объект ТабличныйДокумент. Разберем по шагам алгоритм считывания данных из файла:
ТабличныйДокумент.Прочитать(), указав путь к файлу и способ открытия.Область(), сразу помещая полученные значения в таблицу значений или справочник/документ информационной базы.Посмотрим на пример загрузки данных из файла XLSX напрямую в 1С:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
Исключение
ВызватьИсключение "Не удалось прочитать файл: " + ОписаниеОшибки();
КонецПопытки;
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 1 По ВсегоСтрок Цикл
ЗначениеКолонки1 = ТабДок.Область(НомерСтроки, 1).Текст;
ЗначениеКолонки2 = ТабДок.Область(НомерСтроки, 2).Текст;
// Дальнейшая обработка полученных данных
КонецЦикла;
Важные нюансы платформенного чтения:
ТабличныйДокумент в памяти создается структура документа со всеми стилями и форматированием. На очень больших таблицах (сотни тысяч строк) это может приводить к ошибкам нехватки памяти, особенно в 32-разрядных приложениях.Если для обмена или передачи на сторонние сервисы все же требуется именно формат CSV, сформировать его из прочитанного документа правильнее всего с помощью специализированного объекта ЗаписьCSV, а не через простую конкатенацию строк в ТекстовыйДокумент.
Объект ЗаписьCSV автоматически контролирует правила экранирования: заключает в кавычки текст, содержащий разделители или переносы строк, и удваивает внутренние кавычки. Рассмотрим пример выгрузки прочитанного табличного документа в файл CSV:
Запись = Новый ЗаписьCSV;
ПараметрыCSV = Новый ПараметрыЗаписиCSV(";", """", Символы.ВК + Символы.ПС, КодировкаТекста.UTF8);
Запись.ОткрытьФайл(ПутьКВыходномуФайлуCSV, ПараметрыCSV);
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
МассивЗначений = Новый Массив;
Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
МассивЗначений.Добавить(ТабДок.Область(НомерСтроки, НомерКолонки).Текст);
КонецЦикла;
Запись.ЗаписатьСтроку(МассивЗначений);
КонецЦикла;
Запись.Закрыть();
Если требуется пакетная конвертация файлов сторонними средствами без написания сложных алгоритмов разбора, можно использовать бесплатные офисные пакеты, такие как LibreOffice или OpenOffice. Они поддерживают запуск из командной строки в безголовом режиме (headless), что позволяет вызывать их непосредственно из кода 1С через команду ЗапуститьПриложение().
Пример консольной команды, преобразующей файл XLSX в CSV с помощью LibreOffice:
libreoffice --headless --convert-to csv /путь/к/файлу.xlsx --outdir /папка/назначения/
Такой подход удобен для интеграции в фоновые регламентные задания на серверах, где нежелательно разворачивать платные офисные лицензии.
Для файлов формата XLS и XLSX в операционных системах семейства Windows можно использовать подключение как к базе данных через технологию ADO с установленным драйвером Microsoft Access Database Engine (ACE.OLEDB). Это позволяет выполнять выборку данных с помощью привычных SQL-запросов (SELECT * FROM [Лист1$]) без установленного пакета Excel.
Однако этот метод имеет свои ограничения:
Для обработки огромных объемов информации (файлы размером в сотни мегабайт), когда ТабличныйДокумент перегружает оперативную память сервера, эффективнее всего использовать внешние легковесные скрипты (например, на Python с библиотеками потокового чтения вроде openpyxl в режиме read_only) либо специализированные консольные утилиты. Они считывают данные построчно с минимальным потреблением ресурсов и формируют готовый CSV-файл, который затем быстро и стабильно загружается в 1С через ЧтениеCSV.