Как правильно выбирать и загружать файлы в мобильном клиенте 1С на Android?

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

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

Почему не стоит использовать ДиалогВыбораФайла для мобильных устройств?

Многие разработчики, переходящие с десктопных версий 1С, пытаются использовать ДиалогВыбораФайла. Однако на Android (особенно в версиях 10 и выше) существует модель безопасности, называемая Scoped Storage. Она ограничивает прямой доступ приложений к папкам устройства. Даже если вы выдали приложению все разрешения в настройках телефона, системный путь вида /storage/emulated/0/... может быть недоступен для чтения напрямую через объекты языка 1С. В результате вы получаете ошибку «Ошибка доступа к файлу» или ошибку при создании ДвоичныеДанные.

Правильное решение: использование метода ПоместитьФайл

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

Пошаговая реализация загрузки файла

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

Шаг 1: Клиентская процедура выбора файла

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


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

Шаг 2: Серверная процедура сохранения

Важно помнить, что временное хранилище очищается после завершения сеанса или закрытия формы. Поэтому данные нужно максимально быстро перенести в Справочник или РегистрСведений, используя тип ХранилищеЗначения.


&НаСервере
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища, ИмяФайла, ПутьКФайлу)
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    
    // Создаем запись в табличной части (или справочнике)
    НовыйПрикрепленныйФайл = ДокументОбъект.ПрикрепленныеФайлы.Добавить();
    НовыйПрикрепленныйФайл.ИмяФайла = ИмяФайла;
    НовыйПрикрепленныйФайл.ПутьКФайлу = ПутьКФайлу;
    
    // Сохраняем бинарные данные в ХранилищеЗначения
    НовыйПрикрепленныйФайл.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных);
    
    // Финализируем изменения
    Модифицированность = Ложь;
    УдалитьИзВременногоХранилища(АдресВременногоХранилища);
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры

Рекомендации по отладке

  1. Проверка разрешений: Убедитесь, что в конфигураторе для мобильного приложения включены все необходимые права (память, камера) — помогут в этом инструменты для разработки и отладки кода 1С.
  2. Сборка приложения: Старайтесь тестировать функционал на собранном APK-файле, а не на «Мобильной платформе для разработки». Манифест прав в скомпилированном приложении может отличаться, что часто является причиной «фантомных» ошибок.
  3. Использование альтернатив: Если стандартный метод все равно вызывает проблемы на специфических устройствах (например, Samsung), некоторые разработчики создают собственную ОбщаяФорма.ВыбратьФайл, внутри которой программно заполняется дерево значений с файлами, доступными приложению. Однако этот метод более трудозатратный и менее универсальный.
  4. Режим энергосбережения: Иногда избыточные настройки оптимизации батареи на современных смартфонах ограничивают доступ к системным API — попробуйте отключить режим энергосбережения при тестировании приложения.

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

← На главную