Как прочитать конкретный лист из файла Excel в табличный документ 1С

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

При импорте данных из файлов Excel формата .xls или .xlsx разработчики часто сталкиваются с ситуацией, когда стандартный метод Прочитать() объекта ТабличныйДокумент загружает данные всех листов книги одновременно, объединяя их разрывами страниц. Разберем по шагам, как устроена работа платформы 1С с многостраничными документами Excel и какими способами можно выгрузить данные только нужного листа.

Особенности работы метода Прочитать() табличного документа

Рассмотрим, как платформа 1С по умолчанию обрабатывает файлы Excel. При вызове метода ТабДок.Прочитать(ИмяФайла) происходит следующее:

  1. Платформа загружает содержимое всех листов книги Excel в один ТабличныйДокумент.
  2. Каждый лист файловой книги автоматически превращается в отдельную именованную область (ОбластьТабличногоДокумента).
  3. Имя области совпадает с названием листа в Excel. Если в названии присутствуют пробелы или спецсимволы, платформа автоматически заменяет их на знаки подчеркивания _. Если имя листа начинается с цифры, в начало имени области добавляется символ _.

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

Способ 1. Извлечение области нужного листа через штатный ТабличныйДокумент

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

Рассмотрим пример кода:


ТабДокЗагрузка = Новый ТабличныйДокумент;
ТабДокЗагрузка.Прочитать(ИмяФайла);

// Имя области соответствует названию листа Excel (учитывая замену пробелов на _)
ИмяНужногоЛиста = "Лист1"; 

Попытка
    ОбластьЛиста = ТабДокЗагрузка.ПолучитьОбласть(ИмяНужногоЛиста);
    
    // Помещаем данные нужного листа в новый табличный документ
    ТабДокРезультат = Новый ТабличныйДокумент;
    ТабДокРезультат.Вывести(ОбластьЛиста);
    
    // Далее работаем с ТабДокРезультат
    КоличествоСтрок = ТабДокРезультат.ВысотаТаблицы;
    КоличествоКолонок = ТабДокРезультат.ШиринаТаблицы;
Исключение
    Сообщить("Не удалось найти лист с именем: " + ИмяНужногоЛиста);
КонецПопытки;

Способ 2. Чтение файлов XLSX через прямое распаковывание архива (Native XLSX)

Файлы формата .xlsx представляют собой ZIP-архив, содержащий XML-файлы с данными. Если требуется высокая скорость работы и обработка только конкретной страницы без загрузки всей книги в память 1С, разберем алгоритм прямой работы с файлом:

  1. Распаковываем .xlsx файл как ZIP-архив во временный каталог с помощью объекта ЧтениеZipФайла.
  2. Переходим к папке xl\worksheets\ внутри распакованного каталога. Листы хранятся в файлах вида sheet1.xml, sheet2.xml и так далее.
  3. Считываем нужный XML-файл с помощью объектов ЧтениеXML или ПостроительDOM.

Этот способ отличается высокой скоростью выполнения, однако требует написания кода для разбора XML-структуры ячеек и стилей Excel.

Альтернативные способы чтения листов

Если штатные возможности табличного документа не подходят под задачу, рассмотрим еще несколько распространенных подходов:

  1. Использование COM-объекта (Excel.Application): Позволяет открыть книгу и обратиться к конкретному листу по имени или индексу через коллекцию Worksheets. Подходит только для Windows-серверов или клиентов с установленным Microsoft Excel.
  2. Подключение через ADO (ADODB.Connection): Файл Excel подключается как база данных, а нужный лист выступает в роли таблицы (например, SELECT * FROM [Лист1$]). Метод работает быстро, но требователен к установленным провайдерам OLE DB/ACE.
  3. Подготовка однолистных файлов: Если выбор технологии ограничен, самым простым организационным решением является требование к пользователям загружать файлы, содержащие только один рабочий лист.
← На главную