При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача передачи данных или сохранения файлов на центральный сервер или в общую сетевую папку. Разработчики, привыкшие к среде Windows, часто пытаются использовать стандартные UNC-пути (например, \\192.168.1.1\Folder\file.txt), однако в мобильной среде этот подход неизбежно приводит к ошибке "Файл не обнаружен".
В этой статье мы разберем, почему прямая запись по сети не работает на мобильных устройствах, и рассмотрим наиболее надежные и эффективные способы решения этой задачи, которые используются в профессиональной разработке.
Проанализируем техническую сторону вопроса. Операционные системы Android и iOS построены на базе ядер, отличных от Windows. Поддержка протокола SMB (Server Message Block), который обеспечивает работу сетевых папок в Windows, не встроена в файловую систему мобильных ОС на уровне ядра так, чтобы приложения могли обращаться к ним как к локальным дискам.
Когда мы используем объект ЗаписьТекста или КопироватьФайл в мобильном приложении 1С, платформа ожидает путь к локальному файлу в песочнице приложения. Мобильная операционная система просто "не понимает", что делать с адресом, начинающимся на двойной обратный слэш. Следовательно, стандартные методы работы с файлами 1С не могут достучаться до сетевого ресурса напрямую.
Рассмотрим наиболее правильный с точки зрения архитектуры 1С метод. Вместо того чтобы пытаться заставить телефон "увидеть" серверную папку, мы научим сервер принимать файлы от телефона. Для этого в основной базе 1С, расположенной на сервере, создается HTTP-сервис.
Разберем по шагам, как это реализовать:
/upload и методом POST.ДвоичныеДанные и сохраняет их на диск.ДвоичныеДанные и отправляем через HTTPЗапрос.Пример кода для мобильного приложения:
// 1. Формируем локальный файл
ИмяФайла = КаталогДокументов() + "report.txt";
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Данные для сервера");
Запись.Закрыть();
// 2. Отправляем файл на сервер
ФайлОтправки = Новый Файл(ИмяФайла);
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
НТТРСоединение = Новый HTTPСоединение("192.168.1.33", , Логин, Пароль);
Запрос = Новый HTTPЗапрос("/base/hs/fileservice/upload");
Запрос.Заголовки.Вставить("File-Name", ФайлОтправки.Имя);
Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеФайла);
Ответ = НТТРСоединение.ОтправитьДляОбработки(Запрос);
На стороне сервера (в базе 1С) код будет выглядеть следующим образом:
Функция uploadPOST(Запрос)
ИмяФайла = Запрос.Заголовки.Получить("File-Name");
Данные = Запрос.ПолучитьТелоКакДвоичныеДанные();
// Здесь сервер уже имеет доступ к сети \\192.168.1.33\111\
ПутьДляСохранения = "\\192.168.1.33\111\" + ИмяФайла;
Данные.Записать(ПутьДляСохранения);
Возврат Новый HTTPСервисОтвет(200);
КонецФункции
Этот метод является самым стабильным, так как он не зависит от настроек прав доступа к сетевым папкам на мобильном устройстве и работает через стандартные порты веб-сервера.
Если на сервере есть возможность поднять FTP-сервер, то мобильная платформа 1С позволяет работать с ним напрямую через встроенный объект FTPСоединение. Это избавляет от необходимости писать HTTP-сервисы.
Проанализируем ситуацию: FTP-протокол специально предназначен для передачи файлов и отлично поддерживается мобильной платформой 1С. Выясним, как это реализовать в коде:
// Создаем соединение с сервером
Соединение = Новый FTPСоединение("192.168.1.33", 21, "User", "Password");
// Записываем файл локально
ПутьЛокальный = КаталогДокументов() + "data.txt";
Текст = Новый ЗаписьТекста(ПутьЛокальный);
Текст.ЗаписатьСтроку("Служебная информация");
Текст.Закрыть();
// Передаем файл на FTP-сервер
Соединение.Записать(ПутьЛокальный, "/shared_folder/data.txt");
Важный момент: убедитесь, что FTP-сервер настроен на работу в пассивном режиме, так как мобильные сети и Wi-Fi роутеры часто блокируют активные соединения.
Если необходимо, чтобы мобильное приложение "думало", что пишет в локальную папку, а файл магическим образом оказывался на сервере, можно использовать сторонние утилиты. Программы типа FolderSync или Resilio Sync позволяют настроить автоматическую синхронизацию конкретной папки на телефоне (например, КаталогДокументов() приложения 1С) с сетевым ресурсом SMB или облаком.
Алгоритм действий будет следующим:
Записать() в локальный каталог.Однако стоит помнить, что в современных версиях Android (11 и выше) действует политика Scoped Storage, которая ограничивает доступ сторонних приложений к папкам других приложений. Поэтому этот способ требует тщательной настройки разрешений.
Подведем итог нашего анализа. Прямая работа с \\IP-адрес в мобильной 1С невозможна по причине ограничений операционных систем Android и iOS.
Для реализации задачи рекомендуем придерживаться следующих правил:
КаталогДокументов(), и только потом инициируйте его передачу по сети.Попытка...Исключение при вызове сетевых методов.Выбрав один из предложенных вариантов, вы сможете надежно реализовать сохранение файлов по сети, избежав ошибок доступа к файловой системе.