При разработке мобильных приложений на платформе 1С часто возникают сложности при попытке обращения к файловой системе устройства. Одной из самых частых ошибок является отказ в доступе при попытке считать файл по «жесткому» пути, например, через ДиалогВыбораФайла. Давайте разберемся, почему это происходит и как правильно реализовать выбор файлов, чтобы ваше приложение работало стабильно на всех устройствах — есть готовая обработка загрузки документов со смартфонов в 1С.
Многие разработчики, переходящие с десктопных версий 1С, пытаются использовать ДиалогВыбораФайла. Однако на Android (особенно в версиях 10 и выше) существует модель безопасности, называемая Scoped Storage. Она ограничивает прямой доступ приложений к папкам устройства. Даже если вы выдали приложению все разрешения в настройках телефона, системный путь вида /storage/emulated/0/... может быть недоступен для чтения напрямую через объекты языка 1С. В результате вы получаете ошибку «Ошибка доступа к файлу» или ошибку при создании ДвоичныеДанные.
Чтобы избежать блокировок со стороны операционной системы, необходимо использовать механизм, предусмотренный разработчиками платформы 1С специально для мобильных устройств — функцию ПоместитьФайл. Этот метод вызывает системный диалог выбора файлов, который является «доверенным» для Android, и позволяет безопасно передать данные в 1С.
Рассмотрим пример кода, который позволит вам корректно выбрать файл, получить его представление и сохранить в объект конфигурации (например, в справочник или регистр) — для этого подойдёт загрузка изображений в карточки 1С со смартфона. Мы разделим логику на две части: клиентскую, где происходит выбор файла, и серверную, где происходит запись данных в базу.
Шаг 1: Клиентская процедура выбора файла
В этой процедуре мы используем ПоместитьФайл. Обратите внимание, что мы сразу переносим данные во временное хранилище, откуда их будет удобно забрать на сервере.
&НаКлиенте
Процедура ВыбратьФайлСДискаИЗаписать()
Перем ВыбранноеИмя;
Перем АдресВременногоХранилища;
// Помещаем файл во временное хранилище с помощью системного диалога
Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина) Тогда
Файл = Новый Файл(ВыбранноеИмя);
ПутьКФайлу = Файл.ПолноеИмя;
// Получаем представление файла, понятное мобильной платформе
ПредставлениеФайла = Файл.ПолучитьПредставлениеФайлаБиблиотекиМобильногоУстройства;
// Передаем данные на сервер для сохранения в базу
ПоместитьФайлОбъекта(АдресВременногоХранилища, ПредставлениеФайла, ПутьКФайлу);
КонецЕсли;
КонецПроцедуры
Шаг 2: Серверная процедура сохранения
Важно помнить, что временное хранилище очищается после завершения сеанса или закрытия формы. Поэтому данные нужно максимально быстро перенести в Справочник или РегистрСведений, используя тип ХранилищеЗначения.
&НаСервере
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища, ИмяФайла, ПутьКФайлу)
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
// Создаем запись в табличной части (или справочнике)
НовыйПрикрепленныйФайл = ДокументОбъект.ПрикрепленныеФайлы.Добавить();
НовыйПрикрепленныйФайл.ИмяФайла = ИмяФайла;
НовыйПрикрепленныйФайл.ПутьКФайлу = ПутьКФайлу;
// Сохраняем бинарные данные в ХранилищеЗначения
НовыйПрикрепленныйФайл.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных);
// Финализируем изменения
Модифицированность = Ложь;
УдалитьИзВременногоХранилища(АдресВременногоХранилища);
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры
APK-файле, а не на «Мобильной платформе для разработки». Манифест прав в скомпилированном приложении может отличаться, что часто является причиной «фантомных» ошибок.ОбщаяФорма.ВыбратьФайл, внутри которой программно заполняется дерево значений с файлами, доступными приложению. Однако этот метод более трудозатратный и менее универсальный.Следуя этим рекомендациям, вы сможете наладить надежную работу с файлами в своем мобильном клиенте 1С, избегая ошибок доступа и обеспечивая комфортную работу пользователей.