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

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача передачи данных или сохранения файлов на центральный сервер или в общую сетевую папку. Разработчики, привыкшие к среде Windows, часто пытаются использовать стандартные UNC-пути (например, \\192.168.1.1\Folder\file.txt), однако в мобильной среде этот подход неизбежно приводит к ошибке "Файл не обнаружен".

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

Почему прямой путь вида \\server\share не работает?

Проанализируем техническую сторону вопроса. Операционные системы Android и iOS построены на базе ядер, отличных от Windows. Поддержка протокола SMB (Server Message Block), который обеспечивает работу сетевых папок в Windows, не встроена в файловую систему мобильных ОС на уровне ядра так, чтобы приложения могли обращаться к ним как к локальным дискам.

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

Решение №1: Использование HTTP-сервисов (рекомендуемый способ)

Рассмотрим наиболее правильный с точки зрения архитектуры 1С метод. Вместо того чтобы пытаться заставить телефон "увидеть" серверную папку, мы научим сервер принимать файлы от телефона. Для этого в основной базе 1С, расположенной на сервере, создается HTTP-сервис.

Разберем по шагам, как это реализовать:

  1. На стороне сервера создаем HTTP-сервис с шаблоном пути, например, /upload и методом POST.
  2. В обработчике метода на сервере пишем код, который принимает тело запроса как ДвоичныеДанные и сохраняет их на диск.
  3. В мобильном приложении формируем файл, считываем его в ДвоичныеДанные и отправляем через 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);
КонецФункции

Этот метод является самым стабильным, так как он не зависит от настроек прав доступа к сетевым папкам на мобильном устройстве и работает через стандартные порты веб-сервера.

Решение №2: Использование протокола FTP

Если на сервере есть возможность поднять FTP-сервер, то мобильная платформа 1С позволяет работать с ним напрямую через встроенный объект FTPСоединение. Это избавляет от необходимости писать HTTP-сервисы.

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


// Создаем соединение с сервером
Соединение = Новый FTPСоединение("192.168.1.33", 21, "User", "Password");

// Записываем файл локально
ПутьЛокальный = КаталогДокументов() + "data.txt";
Текст = Новый ЗаписьТекста(ПутьЛокальный);
Текст.ЗаписатьСтроку("Служебная информация");
Текст.Закрыть();

// Передаем файл на FTP-сервер
Соединение.Записать(ПутьЛокальный, "/shared_folder/data.txt");

Важный момент: убедитесь, что FTP-сервер настроен на работу в пассивном режиме, так как мобильные сети и Wi-Fi роутеры часто блокируют активные соединения.

Решение №3: Специализированное ПО для синхронизации (FolderSync и аналоги)

Если необходимо, чтобы мобильное приложение "думало", что пишет в локальную папку, а файл магическим образом оказывался на сервере, можно использовать сторонние утилиты. Программы типа FolderSync или Resilio Sync позволяют настроить автоматическую синхронизацию конкретной папки на телефоне (например, КаталогДокументов() приложения 1С) с сетевым ресурсом SMB или облаком.

Алгоритм действий будет следующим:

  1. Установите приложение синхронизации на мобильное устройство.
  2. Настройте в нем пару: локальная папка 1С <-> сетевая папка на сервере.
  3. В 1С просто сохраняйте файл методом Записать() в локальный каталог.
  4. Внешнее приложение в фоновом режиме обнаружит новый файл и отправит его по сети.

Однако стоит помнить, что в современных версиях Android (11 и выше) действует политика Scoped Storage, которая ограничивает доступ сторонних приложений к папкам других приложений. Поэтому этот способ требует тщательной настройки разрешений.

Резюме и рекомендации

Подведем итог нашего анализа. Прямая работа с \\IP-адрес в мобильной 1С невозможна по причине ограничений операционных систем Android и iOS.

Для реализации задачи рекомендуем придерживаться следующих правил:

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

← На главную