При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача оперативной передачи данных или файлов (например, фотографий товаров или текстовых отчетов) непосредственно на компьютер в локальной сети. Однако многие разработчики сталкиваются с тем, что стандартные пути Windows вида \\192.168.0.1\SharedFolder, которые прекрасно работают в десктопной версии, в мобильном приложении выдают ошибку "Путь не обнаружен".
В этой статье мы подробно проанализируем, почему возникает эта проблема, и рассмотрим несколько надежных способов ее решения, от простых настроек до создания микросервисов.
Разберем причину этого ограничения. Операционные системы Android и iOS используют совершенно иные протоколы файловых систем по сравнению с Windows. Прямой доступ по протоколу SMB (CIFS), который обеспечивает работу «сетевых папок», на мобильных устройствах не интегрирован в ядро системы так, как это сделано в Windows. Для мобильной ОС сетевая папка не является частью локального дерева каталогов.
Кроме того, мобильное приложение 1С работает в защищенном окружении («песочнице»), и объект КопироватьФайл() ожидает увидеть путь к локальному хранилищу устройства. Чтобы решить задачу, нам нужно создать «мостик» между мобильным устройством и целевым ПК.
Рассмотрим наиболее универсальный вариант: поднять на компьютере-получателе легкий веб-сервер. Это может быть Apache, IIS или даже XAMPP. Основная идея заключается в том, что мобильная 1С умеет отлично работать с HTTP-запросами.
Проанализируем алгоритм действий:
POST и сохраняет его в нужную папку.HTTPСоединение.Пример простейшего кода в мобильной 1С для отправки файла:
// Определяем параметры соединения
Сервер = "192.168.0.1"; // IP вашего компьютера
Порт = 80;
Соединение = Новое HTTPСоединение(Сервер, Порт);
// Формируем запрос
Запрос = Новое HTTPЗапрос("/upload.php");
Запрос.УстановитьТелоИзФайла(ПутьКЛокальномуФайлу);
// Отправляем файл
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Файл успешно передан!");
Иначе
Сообщить("Ошибка передачи: " + Ответ.КодСостояния);
КонецЕсли;
Если вы не хотите устанавливать громоздкие веб-серверы типа Apache, можно использовать компактный микросервис. Рассмотрим пример реализации на языке Go (Golang). Такой сервис представляет собой один исполняемый файл (.exe), который можно запустить на любом ПК в сети.
Проанализируем пример кода микросервиса, который принимает POST-запрос с файлом:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
func setFile(w http.ResponseWriter, r *http.Request) {
// Читаем данные из тела запроса
bData, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println("Ошибка чтения:", err)
return
}
// Сохраняем файл в текущую папку
filename := "./received_file.txt"
err = ioutil.WriteFile(filename, bData, 0644)
if err != nil {
fmt.Println("Ошибка записи:", err)
w.WriteHeader(500)
return
}
fmt.Println("Файл успешно принят и сохранен!")
w.WriteHeader(200)
}
func main() {
http.HandleFunc("/upload", setFile)
log.Fatal(http.ListenAndServe(":1717", nil))
}
Этот сервис будет слушать порт 1717. В 1С вам останется только изменить адрес запроса на http://192.168.0.1:1717/upload. Преимущество этого метода в том, что он работает крайне быстро и не требует сложной настройки окружения на ПК.
Выясним, какой способ является наиболее «родным» для платформы 1С. Это использование объекта FTPСоединение. Почти любой современный роутер или компьютер позволяет запустить FTP-сервер за пару минут.
Разберем по шагам, как это реализовать:
// Параметры доступа к FTP
Сервер = "192.168.0.1";
Порт = 21;
Логин = "admin";
Пароль = "password";
Попытка
Соединение = Новое FTPСоединение(Сервер, Порт, Логин, Пароль);
// Записываем файл на сервер
Соединение.Записать(ПутьКФайлуНаТелефоне, "catalog/my_file.txt");
Сообщить("Передача по FTP завершена!");
Исключение
Сообщить("Ошибка FTP: " + ИнформацияОбОшибке().Описание);
КонецПопытки;
Важный момент: FTP-протокол гораздо устойчивее к разрывам связи при использовании Wi-Fi, чем попытки монтирования сетевых дисков.
Если у вас уже есть основная база 1С, на которую мобильное приложение передает данные (синхронизируется), самым правильным архитектурным решением будет создание HTTP-сервиса прямо внутри конфигурации 1С.
Рассмотрим этот процесс подробнее:
POST.ДвоичныеДанные из тела запроса.ДвоичныеДанные.Записать(ПолныйПутьКСетевойПапке).Поскольку серверная часть основной базы работает под ОС Windows, она имеет полный доступ к сетевым путям (если у пользователя, под которым запущен сервер 1С, есть соответствующие права). Таким образом, мобильное устройство передает файл на сервер 1С, а сервер 1С уже кладет его в нужную сетевую папку.
Пример кода серверного метода 1С:
Функция ПринятьФайл(Запрос)
Данные = Запрос.ПолучитьТелоКакДвоичныеДанные();
Путь = "\\ServerName\Public\files\report.txt";
Попытка
Данные.Записать(Путь);
Возврат Новое HTTPСервисОтвет(200);
Исключение
Возврат Новое HTTPСервисОтвет(500);
КонецПопытки;
КонецФункции
Проанализируем ситуацию с нестабильным Wi-Fi. Если связь часто обрывается, использование сетевых папок (даже если бы они работали) — плохая затея, так как протокол SMB крайне чувствителен к задержкам. В таких случаях мы рекомендуем:
Подводя итог, можно сказать, что хотя прямого способа «положить файл в сетевую папку» из мобильной 1С не существует, использование HTTP или FTP протоколов полностью решает задачу, обеспечивая при этом гораздо более высокую надежность и контроль над процессом передачи данных.