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

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

Разберем весьма распространенную задачу при разработке на мобильной платформе 1С: необходимость записать произвольный файл (например, текстовый документ или команду для принтера этикеток) в расшаренную сетевую папку (SMB) локальной сети. На первый взгляд задача кажется простой, но разработчики часто сталкиваются с неожиданными ограничениями мобильной ОС.

Анализ проблемы: почему стандартный код выдает ошибку

Рассмотрим стандартный подход, который отлично работает на настольных компьютерах под управлением Windows. Программисты пытаются использовать привычные UNC-пути:


Текст = Новый ЗаписьТекста("\\192.168.1.33\111\1.txt", КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку("Текст");
Текст.Закрыть();

При выполнении этого кода в мобильном приложении на ОС Android мы закономерно получаем ошибку: Файл не обнаружен '\\192.168.1.33\111\1.txt'. Выясним причину такого поведения. Дело в том, что в Android нет встроенных системных средств для работы по протоколам NetBIOS, SMB или NetBEUI "из коробки". Путь для Android — это всегда часть локальной файловой системы, которая начинается с корневого каталога /.

Мобильная 1С не умеет самостоятельно авторизовываться в Windows-шарах. Для операционной системы Android путь с обратными слешами и IP-адресом просто не существует. Проанализируем доступные варианты решения этой проблемы, от простых "костылей" до правильных архитектурных подходов.

Решение 1: Использование фоновой синхронизации через SMBSync2

Если вам нужно простое и рабочее решение без развертывания дополнительных серверов, рассмотрим вариант с использованием стороннего приложения SMBSync2. Это приложение умеет подключаться к сетевым папкам Windows и синхронизировать локальные каталоги телефона с сетевыми ресурсами.

  1. Установите на Android-устройство приложение SMBSync2.
  2. Настройте в нем правило синхронизации: укажите локальную папку на устройстве и целевую сетевую SMB-папку.
  3. В коде мобильного приложения 1С сначала сохраните нужный файл локально в синхронизируемую папку с помощью ЗаписьТекста.
  4. После сохранения вызовите запуск задачи синхронизации через ЗапускПриложенияМобильногоУстройства:

НовВз = Новый ЗапускПриложенияМобильногоУстройства;
НовВз.Действие = "com.sentaroh.android.SMBSync2.ACTION_START_SYNC";
НовВз.Запустить(Истина);

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

Решение 2: Отправка файла через ES Проводник (через Intent)

Посмотрим на альтернативный метод с использованием популярных файловых менеджеров. Если на устройстве установлен ES Проводник (или его аналоги с поддержкой LAN), мы можем передать ему команду на сохранение локального файла по сети.

Сначала формируем файл в локальном каталоге устройства, получаем его путь и передаем в приложение через механизм Android Intent:


ЗПМУ = Новый ЗапускПриложенияМобильногоУстройства;
ЗПМУ.Действие = "android.intent.action.SEND";
ЗПМУ.ДополнительныеДанные.Добавить("android.intent.extra.STREAM", "file://" + ИмяЛокальногоФайла, "Uri");
ЗПМУ.Тип = "*/*";
ЗПМУ.Приложение = "com.estrongs.android.pop";
ЗПМУ.ИмяКласса = "com.estrongs.android.pop.app.SaveToESActivity";
ЗПМУ.Запустить(Истина);

Минус этого решения — зависимость от конкретного стороннего приложения и возможные проблемы с современными ограничениями Android (Scoped Storage в Android 10+), из-за которых сторонний файловый менеджер может не получить доступ к файлу в изолированной папке приложения 1С.

Решение 3: HTTP-сервисы (Рекомендуемый подход)

Проанализируем архитектурно правильный способ решения. Если мобильное приложение в любом случае работает в корпоративной сети или общается с сервером, лучшим выходом будет отказаться от SMB в пользу протокола HTTP/HTTPS.

Поднимем простой HTTP-сервис на базе сервера 1С (опубликованного на IIS или Apache) или используем WebDAV. Алгоритм работы следующий:

  1. На стороне мобильного приложения формируем файл, считываем его в ДвоичныеДанные.
  2. Создаем HTTPЗапрос. Помещаем двоичные данные файла в тело запроса с помощью УстановитьТелоИзДвоичныхДанных. Имя файла можно передать в заголовках.
  3. Отправляем POST-запрос на сервер 1С.
  4. Сервер 1С (у которого есть доступ к сетевым ресурсам Windows) принимает HTTP-запрос, извлекает двоичные данные и с помощью стандартного метода платформы записывает файл по UNC-пути вида \\192.168.1.33\111\1.txt.

Убедитесь, что пользователю ОС, под которым запущена служба сервера 1С (USRV1CV8), даны права на запись в целевую сетевую папку. Это самый быстрый, стабильный и безопасный способ интеграции мобильных клиентов с серверной инфраструктурой.

Решение 4: Прямая передача данных на принтер (если цель — печать)

Зачастую запись текстового файла в сеть — это лишь промежуточный этап для отправки ZPL-команд на сетевой принтер этикеток (например, Zebra). Если ваша задача именно в этом, избавимся от лишнего звена (сетевой папки).

Сетевые принтеры обычно прослушивают TCP-порт 9100. Мы можем использовать в мобильной 1С объекты для прямой работы с сокетами — отправить текстовую строку команд прямо на IP-адрес принтера.

Используйте прямую передачу через TCP-сокет. Это обеспечит мгновенную печать без необходимости настраивать общие папки, права доступа и обходить ограничения файловой системы Android.

← На главную