Разберем весьма распространенную задачу при разработке на мобильной платформе 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-адресом просто не существует. Проанализируем доступные варианты решения этой проблемы, от простых "костылей" до правильных архитектурных подходов.
Если вам нужно простое и рабочее решение без развертывания дополнительных серверов, рассмотрим вариант с использованием стороннего приложения SMBSync2. Это приложение умеет подключаться к сетевым папкам Windows и синхронизировать локальные каталоги телефона с сетевыми ресурсами.
ЗаписьТекста.ЗапускПриложенияМобильногоУстройства:
НовВз = Новый ЗапускПриложенияМобильногоУстройства;
НовВз.Действие = "com.sentaroh.android.SMBSync2.ACTION_START_SYNC";
НовВз.Запустить(Истина);
При выполнении этого кода синхронизация отработает в фоне, и ваш файл окажется в сетевой папке. Это надежный метод, однако стоит учитывать, что синхронизация происходит не в реальном времени, а с небольшой задержкой на запуск службы.
Посмотрим на альтернативный метод с использованием популярных файловых менеджеров. Если на устройстве установлен 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С.
Проанализируем архитектурно правильный способ решения. Если мобильное приложение в любом случае работает в корпоративной сети или общается с сервером, лучшим выходом будет отказаться от SMB в пользу протокола HTTP/HTTPS.
Поднимем простой HTTP-сервис на базе сервера 1С (опубликованного на IIS или Apache) или используем WebDAV. Алгоритм работы следующий:
ДвоичныеДанные.HTTPЗапрос. Помещаем двоичные данные файла в тело запроса с помощью УстановитьТелоИзДвоичныхДанных. Имя файла можно передать в заголовках.\\192.168.1.33\111\1.txt.Убедитесь, что пользователю ОС, под которым запущена служба сервера 1С (USRV1CV8), даны права на запись в целевую сетевую папку. Это самый быстрый, стабильный и безопасный способ интеграции мобильных клиентов с серверной инфраструктурой.
Зачастую запись текстового файла в сеть — это лишь промежуточный этап для отправки ZPL-команд на сетевой принтер этикеток (например, Zebra). Если ваша задача именно в этом, избавимся от лишнего звена (сетевой папки).
Сетевые принтеры обычно прослушивают TCP-порт 9100. Мы можем использовать в мобильной 1С объекты для прямой работы с сокетами — отправить текстовую строку команд прямо на IP-адрес принтера.
Используйте прямую передачу через TCP-сокет. Это обеспечит мгновенную печать без необходимости настраивать общие папки, права доступа и обходить ограничения файловой системы Android.