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

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

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

Анализируем причину: почему метод Прочитать() выдает ошибку

Для начала проанализируем ситуацию. В синтакс-помощнике указано, что метод Прочитать() объекта ТабличныйДокумент доступен на сервере, в толстом клиенте и на мобильном сервере. Он должен поддерживать форматы Microsoft Excel 97 - 2010 (.xls и .xlsx). Если при попытке загрузки вы видите сообщение об ошибке формата, причин может быть несколько:

  1. Версия формата BIFF: Файлы с расширением .xls могут иметь разную внутреннюю структуру. Платформа 1С поддерживает формат Excel 97-2003 (BIFF8). Если файл был сформирован в очень старой системе (например, экспорт из 1С 7.7 через старые компоненты), он может иметь формат Excel 5.0/95 (BIFF5). Несмотря на то же расширение, такой файл современная платформа прочитать не сможет.
  2. Особенности мобильной платформы: Мобильная платформа имеет более строгие ограничения на библиотеки парсинга бинарных файлов. Зачастую поддержка "старого" .xls там реализована менее стабильно, чем поддержка современного .xlsx (который по сути является набором XML-файлов).
  3. Доступ к файловой системе: На устройствах Android доступ к папкам вроде рабочего стола или загрузок ограничен правами доступа (Scoped Storage). Метод Прочитать() может не иметь прямого доступа к файлу, если путь передан некорректно.

Способ 1. Проверка и конвертация формата Excel

Если вы получаете файл из сторонней системы, например из 1С:Предприятие 7.7, выясним причину несовместимости. Чтобы проверить реальный формат файла, откройте его в настольном приложении Microsoft Excel и выберите "Сохранить как". Обратите внимание на тип файла. Если там указано "Рабочая книга Excel 5.0/95", это и есть причина ошибки.

Разберем, что можно сделать:

Способ 2. Правильная передача файла между Клиентом и Сервером на мобильном устройстве

Часто ошибка возникает не из-за самого файла, а из-за того, как мы пытаемся его прочитать. На мобильной платформе крайне важно соблюдать цепочку передачи данных через временное хранилище, даже если кажется, что "база файловая и всё находится на одном устройстве".

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


&НаКлиенте
Процедура ОбработкаВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() = 1 Тогда
        // Читаем файл в двоичные данные на клиенте
        ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ВыбранныеФайлы[0]);
        // Помещаем во временное хранилище
        АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
        
        ЗагрузитьФайлНаСервере(АдресХранилища);
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗагрузитьФайлНаСервере(АдресХранилища)
    // Генерируем уникальное имя временного файла с нужным расширением
    ИмяФайла = ПолучитьИмяВременногоФайла("xlsx"); 
    
    // Получаем данные из хранилища
    Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
    Данные.Записать(ИмяФайла);
    
    // Читаем в табличный документ
    ТабДок = Новый ТабличныйДокумент;
    Попытка
        ТабДок.Прочитать(ИмяФайла);
        // Далее работаем с данными ТабДок
    Исключение
        Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Удаляем временный файл после использования
    УдалитьФайлы(ИмяФайла);
КонецПроцедуры

Способ 3. Использование нативного формата .mxl

Проанализируем ситуацию: если ваша цель — передать данные из одной базы 1С в другую (даже с 7.7 на мобильную 8.3), использование Excel является лишним звеном. Формат .mxl поддерживается мобильной платформой гораздо стабильнее.

Преимущества MXL:

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


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

Альтернативные варианты обмена данными

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

  1. Использование XML или JSON: Если данные представляют собой плоскую таблицу (номенклатура, штрихкоды, остатки), попросите выгружать их в текстовый формат. Объект ЧтениеXML или ЧтениеJSON работает на мобильной платформе безупречно и очень быстро.
  2. Конвертация через COM на стороне настольного ПК: Если мобильное приложение синхронизируется с центральной базой, выполняйте чтение "проблемных" Excel-файлов на стороне большой базы (Windows), где доступен полноценный Excel.Application, и передавайте в мобильное приложение уже готовые данные через XDTO или пакеты данных.
  3. Чтение CSV: Файлы Excel можно сохранить как "Текст с разделителями (CSV)". Такой файл можно прочитать обычным объектом ЧтениеТекста, разобрав строки методом СтрРазделить(). Это самый "легкий" способ для мобильного процессора и памяти.

Важные выводы

Подводя итог, отметим: если вы столкнулись с ошибкой чтения .xls в мобильной 1С, первым делом проверьте версию формата (BIFF5 vs BIFF8). Помните, что Excel 95 — это табу для метода Прочитать(). Старайтесь переходить на .xlsx или, что еще лучше для экосистемы 1С, на .mxl. Всегда используйте временное хранилище для передачи файла на серверную часть мобильного приложения, так как это гарантирует обход ограничений прав доступа к файловой системе мобильной ОС.

При использовании ПолучитьИмяВременногоФайла() всегда явно указывайте расширение ("xlsx" или "mxl"), так как метод Прочитать() ориентируется на расширение файла для выбора нужного алгоритма декомпрессии данных.

← На главную