Как прочитать файл Excel (XLSX) на сервере 1С (Linux/Windows) без установки MS Office?

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

При разработке механизмов загрузки данных в 1С часто возникает задача чтения файлов формата Microsoft Excel (.xls, .xlsx). Классический подход, использовавшийся годами, подразумевал работу через OLE-автоматизацию и создание COM-объекта Excel.Application. Однако этот метод имеет существенные недостатки: он требует наличия установленного MS Office на сервере, работает медленно и, самое главное, совершенно неприменим в серверных средах под управлением ОС Linux, где технологии COM/OLE недоступны. В таких случаях на помощь приходит универсальная загрузка из Excel, которая позволяет импортировать данные в справочники без лишних зависимостей.

В этой статье мы подробно разберем, как реализовать чтение Excel-файлов средствами самой платформы 1С:Предприятие 8.3, используя нативные механизмы, которые работают быстро, кроссплатформенно и не требуют установки стороннего софта. Для тех, кому необходимо поддерживать множество расширений, включая старые форматы и CSV, подойдет комплексный инструмент для импорта данных.

Анализ проблемы и выбор инструмента

Рассмотрим ситуацию, когда при попытке выполнить код загрузки на сервере мы получаем ошибку создания COM-объекта или класс не зарегистрирован. Это происходит потому, что серверный процесс 1С не имеет доступа к офисным библиотекам или работает в среде, где их нет.

Для решения этой задачи платформа 1С предоставляет мощный встроенный объект — ТабличныйДокумент. Начиная с версии 8.3.6, методы чтения этого объекта были существенно доработаны и позволяют корректно открывать файлы форматов Excel напрямую.

Преимущества использования Табличного Документа:

  1. Работает на любой операционной системе (Windows, Linux, macOS).
  2. Не требует установки MS Excel или OpenOffice на сервере.
  3. Работает значительно быстрее, чем COM-соединение, так как не тратит время на запуск внешнего процесса.

Реализация загрузки данных через Табличный Документ

Разберем по шагам алгоритм чтения файла. Наша задача — загрузить файл с диска в память 1С и прочитать значения ячеек. Если вы только начинаете разработку собственного механизма, за основу можно взять этот шаблон простой обработки загрузки из excel.

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


// Создаем новый экземпляр табличного документа
ТабДок = Новый ТабличныйДокумент;

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

В данном примере мы использовали параметр СпособЧтенияЗначенийТабличногоДокумента.Значение. Это позволяет сразу получить типизированные данные (числа, даты, булево), а не только строковые представления, что избавляет от необходимости дополнительного преобразования типов.

Обход ячеек и получение данных

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

Предположим, мы знаем, что данные начинаются с первой строки и первой колонки. Определим количество строк, содержащих данные, с помощью свойства ВысотаТаблицы.


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

Для НомерСтроки = 1 По КоличествоСтрок Цикл
    
    // Получаем область ячейки по координатам (Строка, Колонка)
    // Читаем первую колонку (например, Артикул)
    ОбластьАртикул = ТабДок.Область(НомерСтроки, 1);
    Артикул = СокрЛП(ОбластьАртикул.Текст);
    
    // Читаем вторую колонку (например, Цена)
    ОбластьЦена = ТабДок.Область(НомерСтроки, 2);
    // Свойство СодержитЗначение показывает, есть ли в ячейке типизированные данные
    Если ОбластьЦена.СодержитЗначение Тогда 
        Цена = ОбластьЦена.Значение;
    Иначе
        // Если значения нет, пробуем преобразовать текст
        Попытка
            Цена = Число(ОбластьЦена.Текст);
        Исключение
            Цена = 0;
        КонецПопытки;
    КонецЕсли;

    // Далее выполняем логику обработки полученных данных
    // Например, поиск номенклатуры или создание документа
    
КонецЦикла;

Посмотрим на важные нюансы этого кода. Мы используем метод Область(R, C) для доступа к конкретной ячейке. Это эффективный способ. Также мы проверяем свойство СодержитЗначение. Это критически важно, так как в Excel ячейка может иметь формат "Текст", но содержать число. Использование свойства Текст вернет строковое представление, в то время как Значение вернет чистое число или дату.

Оптимизация и работа с большими файлами

Проанализируем возможные подводные камни. Метод ТабличныйДокумент.Прочитать() загружает весь файл целиком в оперативную память сервера. При работе с огромными прайс-листами (сотни тысяч строк) это может привести к значительному потреблению RAM. Если вам требуется обрабатывать все листы книги Excel одновременно, лучше использовать решение типа загрузка файлов Excel и CSV, которая умеет работать с коллекциями листов.

Если вы сталкиваетесь с файлами большого объема, рекомендуем рассмотреть следующие стратегии:

  1. Разделение файлов: Если есть возможность, дробить файлы перед загрузкой.
  2. Использование ПостроителяDOM (для XLSX): Файлы XLSX представляют собой архив с XML-структурой. Их можно распаковать и читать последовательно через ЧтениеXML, что гораздо экономичнее к памяти.
  3. Внешние компоненты: Существуют нативные ВК для Linux/Windows, которые умеют читать Excel потоково.

Однако для большинства типовых задач (файлы до 10-20 тысяч строк) использование встроенного ТабличныйДокумент является стандартом де-факто и наиболее надежным решением.

Частые ошибки при загрузке

Разберем несколько ошибок, которые могут возникнуть в процессе:

Ошибка "Файл занят другим процессом"
Убедитесь, что файл не открыт в Excel у пользователя или не заблокирован антивирусом. В коде 1С перед чтением полезно проверить существование файла методом НайтиФайлы.

Некорректное определение последней строки
Иногда ВысотаТаблицы возвращает 1000000, хотя данных всего 10 строк. Это случается, если в Excel было применено форматирование ко всему листу. В таком случае в цикле чтения следует добавить условие прерывания (Прервать), если встретилось, например, 5 пустых строк подряд.


СчетчикПустых = 0;
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
    ТекстЯчейки = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
    Если ПустаяСтрока(ТекстЯчейки) Тогда
        СчетчикПустых = СчетчикПустых + 1;
        Если СчетчикПустых > 5 Тогда Прервать; КонецЕсли;
    Иначе
        СчетчикПустых = 0;
        // Обработка данных
    КонецЕсли;
КонецЦикла;

Заключение

Мы выяснили, что для чтения Excel файлов в современной платформе 1С 8.3 не требуется использование устаревших и небезопасных COM-объектов. Метод ТабличныйДокумент.Прочитать() является кроссплатформенным, быстрым и удобным инструментом, который закрывает 95% потребностей бизнеса по загрузке данных из таблиц. Используйте приведенные выше примеры кода как шаблон для создания своих обработок загрузки.

← На главную