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

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача оперативной передачи данных или файлов (например, фотографий товаров или текстовых отчетов) непосредственно на компьютер в локальной сети. Однако многие разработчики сталкиваются с тем, что стандартные пути Windows вида \\192.168.0.1\SharedFolder, которые прекрасно работают в десктопной версии, в мобильном приложении выдают ошибку "Путь не обнаружен".

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

Почему мобильная 1С «не видит» сетевые папки?

Разберем причину этого ограничения. Операционные системы Android и iOS используют совершенно иные протоколы файловых систем по сравнению с Windows. Прямой доступ по протоколу SMB (CIFS), который обеспечивает работу «сетевых папок», на мобильных устройствах не интегрирован в ядро системы так, как это сделано в Windows. Для мобильной ОС сетевая папка не является частью локального дерева каталогов.

Кроме того, мобильное приложение 1С работает в защищенном окружении («песочнице»), и объект КопироватьФайл() ожидает увидеть путь к локальному хранилищу устройства. Чтобы решить задачу, нам нужно создать «мостик» между мобильным устройством и целевым ПК.

Способ 1. Использование промежуточного HTTP-сервера (PHP или Python)

Рассмотрим наиболее универсальный вариант: поднять на компьютере-получателе легкий веб-сервер. Это может быть Apache, IIS или даже XAMPP. Основная идея заключается в том, что мобильная 1С умеет отлично работать с HTTP-запросами.

Проанализируем алгоритм действий:

  1. На компьютере устанавливается веб-сервер и создается простой скрипт (например, на PHP), который принимает файл методом POST и сохраняет его в нужную папку.
  2. В мобильном приложении 1С мы отправляем файл через объект HTTPСоединение.

Пример простейшего кода в мобильной 1С для отправки файла:


// Определяем параметры соединения
Сервер = "192.168.0.1"; // IP вашего компьютера
Порт = 80;
Соединение = Новое HTTPСоединение(Сервер, Порт);

// Формируем запрос
Запрос = Новое HTTPЗапрос("/upload.php");
Запрос.УстановитьТелоИзФайла(ПутьКЛокальномуФайлу);

// Отправляем файл
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Сообщить("Файл успешно передан!");
Иначе
    Сообщить("Ошибка передачи: " + Ответ.КодСостояния);
КонецЕсли;

Способ 2. Реализация собственного микросервиса на Go

Если вы не хотите устанавливать громоздкие веб-серверы типа 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. Преимущество этого метода в том, что он работает крайне быстро и не требует сложной настройки окружения на ПК.

Способ 3. Передача через FTP-соединение

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

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

  1. Настройте FTP-сервер на целевом компьютере (можно использовать встроенные средства Windows или бесплатный FileZilla Server).
  2. В мобильной 1С напишите следующий код:

// Параметры доступа к FTP
Сервер = "192.168.0.1";
Порт = 21;
Логин = "admin";
Пароль = "password";

Попытка
    Соединение = Новое FTPСоединение(Сервер, Порт, Логин, Пароль);
    // Записываем файл на сервер
    Соединение.Записать(ПутьКФайлуНаТелефоне, "catalog/my_file.txt");
    Сообщить("Передача по FTP завершена!");
Исключение
    Сообщить("Ошибка FTP: " + ИнформацияОбОшибке().Описание);
КонецПопытки;

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

Способ 4. Публикация HTTP-сервиса в основной базе 1С

Если у вас уже есть основная база 1С, на которую мобильное приложение передает данные (синхронизируется), самым правильным архитектурным решением будет создание HTTP-сервиса прямо внутри конфигурации 1С.

Рассмотрим этот процесс подробнее:

Поскольку серверная часть основной базы работает под ОС Windows, она имеет полный доступ к сетевым путям (если у пользователя, под которым запущен сервер 1С, есть соответствующие права). Таким образом, мобильное устройство передает файл на сервер 1С, а сервер 1С уже кладет его в нужную сетевую папку.

Пример кода серверного метода 1С:


Функция ПринятьФайл(Запрос)
    Данные = Запрос.ПолучитьТелоКакДвоичныеДанные();
    Путь = "\\ServerName\Public\files\report.txt";
    Попытка
        Данные.Записать(Путь);
        Возврат Новое HTTPСервисОтвет(200);
    Исключение
        Возврат Новое HTTPСервисОтвет(500);
    КонецПопытки;
КонецФункции

Рекомендации по стабильности связи

Проанализируем ситуацию с нестабильным Wi-Fi. Если связь часто обрывается, использование сетевых папок (даже если бы они работали) — плохая затея, так как протокол SMB крайне чувствителен к задержкам. В таких случаях мы рекомендуем:

  1. Использовать докачку: При реализации через HTTP-сервисы можно передавать файл частями.
  2. Очередь отправки: Сохраняйте файл локально на мобильном устройстве в специальный регистр или папку "Исходящие". Пытайтесь отправить его регламентным заданием до тех пор, пока не получите успешный ответ от сервера.
  3. Проверка контрольных сумм: После передачи файла всегда проверяйте его целостность (например, через MD5), чтобы убедиться, что из-за помех в Wi-Fi файл не «битый»..

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

← На главную