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

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

Разработка под мобильную платформу 1С:Предприятие всегда сопряжена с определенными нюансами, которые не всегда очевидны из синтакс-помощника. Одной из таких проблем является чтение внешних файлов табличных документов (форматов .xls и .xlsx) непосредственно на мобильном устройстве. Несмотря на то, что документация заявляет поддержку метода Прочитать() для мобильного сервера, на практике разработчики часто сталкиваются с «Ошибкой при выполнении файловой операции».

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

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

Рассмотрим стандартную ситуацию: у нас есть файл Excel, расположенный в памяти смартфона. Мы получаем его путь через ДиалогВыбораФайла и пытаемся загрузить в ТабличныйДокумент на стороне мобильного сервера. На настольном компьютере этот код отрабатывает идеально, но на Android-устройстве происходит сбой.

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

  1. Ограничения прав доступа (Scoped Storage): В современных версиях Android (10 и выше) приложения не могут просто так обращаться к файлам по абсолютным путям вроде /storage/emulated/0/.... Даже если путь кажется правильным, операционная система может блокировать прямой доступ к файлу для низкоуровневых методов платформы 1С.
  2. Специфика парсера XLSX: Формат .xlsx представляет собой ZIP-архив с набором XML-файлов внутри. Мобильная платформа использует облегченные библиотеки для работы с графикой и шрифтами. Если файл Excel содержит сложное форматирование, сводные таблицы или защищенные области, мобильный парсер может просто не справиться с его разбором.
  3. Различие контекстов исполнения: Мобильный сервер — это не то же самое, что сервер полноценного приложения. У него отсутствуют многие системные компоненты (например, COM-объекты или полноценные библиотеки трансформации данных), которые помогают настольной версии 1С «понимать» разные версии Excel.

Метод 1: Проверка через двоичные данные

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


// Пример проверки доступности файла на мобильном устройстве
ПутьКФайлу = "/storage/emulated/0/Download/report.xlsx";
Попытка
    ФайлДД = Новый ДвоичныеДанные(ПутьКФайлу);
    РазмерФайла = ФайлДД.Размер();
    Сообщить("Файл успешно прочитан как двоичные данные. Размер: " + РазмерФайла);
Исключение
    Сообщить("Ошибка доступа к файлу: " + ОписаниеОшибки());
КонецПопытки;

Если этот код выполняется успешно, значит, проблема не в правах доступа Android, а именно во внутреннем механизме разбора формата .xlsx в объекте ТабличныйДокумент.

Метод 2: Работа через временную директорию приложения

Выясним причину, связанную с «виртуальными» путями. Часто 1С на мобильных устройствах корректно работает с файлами только в том случае, если они находятся в «песочнице» приложения. Мы можем попробовать скопировать файл во временный каталог 1С и прочитать его уже оттуда.

Разберем последовательность действий:

  1. Читаем файл в ДвоичныеДанные.
  2. Записываем эти данные в новый файл в КаталогВременныхФайлов().
  3. Пытаемся вызвать Прочитать() для нового пути.

ИмяВременногоФайла = КаталогВременныхФайлов() + "temp_table.xlsx";
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИсходныйПуть);
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);

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

Метод 3: Конвертация в формат MXL на основном сервере (Рекомендуемый)

Если мобильное устройство категорически отказывается понимать структуру .xlsx, самым стабильным решением будет использование «родного» формата 1С — .mxl. Поскольку мобильная платформа оптимизирована именно под него, чтение пройдет мгновенно и с сохранением всех цветов, шрифтов и рамок.

Рассмотрим схему взаимодействия:

  1. Мобильное устройство передает файл Excel на основной сервер (через веб-сервис или передачу двоичных данных в параметре процедуры).
  2. Основной сервер (Windows/Linux) открывает файл методом Прочитать().
  3. Сервер сохраняет его в .mxl с помощью метода Записать().
  4. Полученный .mxl файл (в виде двоичных данных) возвращается на мобильное устройство.
  5. Мобильное приложение читает .mxl без каких-либо ошибок.

Посмотрим на пример кода для серверной части:


// Код на стороне основного сервера (ПК/Сервер 1С)
Функция КонвертироватьВMXL(ДвоичныеДанныеExcel) Экспорт
    ИмяВремExcel = ПолучитьИмяВременногоФайла("xlsx");
    ИмяВремMXL = ПолучитьИмяВременногоФайла("mxl");
    
    ДвоичныеДанныеExcel.Записать(ИмяВремExcel);
    
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ИмяВремExcel); // На ПК это работает стабильно
    ТабДок.Записать(ИмяВремMXL, ТипФайлаТабличногоДокумента.MXL);
    
    Результат = Новый ДвоичныеДанные(ИмяВремMXL);
    
    УдалитьФайлы(ИмяВремExcel);
    УдалитьФайлы(ИмяВремMXL);
    
    Возврат Результат;
КонецФункции

Метод 4: Передача данных через структуру (для простых таблиц)

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

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

Особенности использования параметра СпособЧтенияЗначенийТабличногоДокумента

В обсуждении упоминалось использование второго параметра метода Прочитать(). Стоит помнить, что системное перечисление СпособЧтенияЗначенийТабличногоДокумента может быть недоступно в некоторых контекстах мобильного приложения или требовать явного указания типа. Если вы получаете ошибку «Переменная не определена», попробуйте проверить доступность этого типа в синтакс-помощнике именно для мобильной платформы вашей версии.

Выводы и рекомендации

Проанализировав проблему, можно сделать следующие выводы:

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

← На главную