Почему при чтении XLSX файла в 1С табличный документ получается пустым и как это исправить

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

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

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

Анализируем симптомы и выполняем первичную диагностику

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

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


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

Как мы видим, код предельно прост. Если ВысотаТаблицы равна нулю, но исключение не сработало, значит, 1С считает файл валидным, но не видит в нем строк.

Разбираем технические причины: почему 1С "ослепла"

Рассмотрим внутреннюю структуру файла XLSX. На самом деле это ZIP-архив, внутри которого находятся XML-файлы. Основная причина, по которой 1С (особенно версии 8.3.14) может не видеть данные, кроется в некорректном заполнении атрибута dimension в описании листа.

Внутри архива по пути xl/worksheets/sheet1.xml (номер листа может отличаться) содержится тег <dimension ref="A1:Z100"/>. Этот тег сообщает программе, в каких границах искать данные. Проанализируем возможные проблемы:

  1. Неверный атрибут Dimension: Если стороннее программное обеспечение (например, веб-сервис или библиотека на Python/PHP) сформировало файл и указало ref="A1", хотя данные есть и в других ячейках, встроенный парсер 1С может строго следовать этой инструкции и проигнорировать все, что находится за пределами этой ячейки.
  2. Использование Strict OpenXML: Существует формат "Strict", который является строгим стандартом ISO. Платформа 1С старых релизов (до 8.3.15) гораздо лучше работает с "Transitional" (переходным) форматом, который использует Excel по умолчанию.
  3. Специфические символы в Shared Strings: Все текстовые данные хранятся в файле sharedStrings.xml. Если в данных присутствуют управляющие символы ASCII (ниже 0x20), которые не были экранированы, парсер 1С может просто прекратить чтение листа.
  4. Регистр имен файлов (актуально для Linux): Если вы работаете на Linux, 1С чувствительна к регистру имен файлов внутри ZIP-архива. Если папка внутри называется WorkSheets вместо worksheets, платформа может не найти данные.

Способ 1: Метод "нормализации" через копирование данных

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

Почему это помогает? При ручном копировании данных в новый файл Microsoft Excel создает абсолютно чистую и правильную XML-структуру "с нуля". Он заново пересчитывает dimension, очищает styles.xml от поврежденных ссылок и пересобирает sharedStrings.xml. Это подтверждает, что проблема была именно в "битой" структуре исходного файла, которую Excel умеет исправлять "на лету", а 1С — нет.

Способ 2: Обновление платформы 1С

Выясним влияние версии платформы. В версии 8.3.14.1854, которая упоминалась в обсуждении, действительно наблюдались проблемы с парсингом XLSX. Разработчики 1С регулярно выпускают исправления для механизмов работы с файлами. Проанализируем ситуацию: если на одной машине файл открывается, а на другой (с версией 8.3.14) — нет, значит, обновление платформы до актуальных релизов (например, 8.3.18 и выше) решит проблему без изменения кода.

Способ 3: Использование альтернативных методов чтения

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

  1. Использование COM-объекта (только для Windows): Если сервер или клиент работает под управлением Windows и установлен Excel, можно использовать Excel.Application. Этот метод самый надежный в плане чтения любых файлов, так как сам Excel исправляет ошибки структуры при открытии.
    
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Книга = Эксель.Workbooks.Open(ПутьКФайлу);
        // Дальнейшая логика перебора ячеек
    Исключение
        Сообщить("Excel не установлен или файл поврежден");
    КонецПопытки;
    
  2. Конвертация на стороне Linux: На Linux-системах можно использовать консольные утилиты (например, ssconvert из пакета Gnumeric) для предварительной конвертации XLSX в CSV, который 1С читает без проблем в любом состоянии.

Рекомендации по предотвращению проблемы

Чтобы избежать подобных ситуаций в будущем, рекомендуем придерживаться следующих правил:

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

← На главную