gifts2017

Работа с ftp из мобильного приложения 1С

Опубликовал Arsen r (NekoZver) в раздел Программирование - Мобильные приложения

Работа с ftp из мобильного приложения 1С с использованием сторонней программы

Добрый день!

Я собираюсь поделиться опытом в разработке мобильного приложения средствами 1С. На данный момент, к моему глубочайшему сожалению, мобильная 1С не умеет одну очень важную вещь. В отличие от обычного клиента мобильный не знает, что такое FTPсоединение.

Глубокий поиск по просторам интернета привел меня к выводу, что решение проблемы возможно в  4 вариантах:

1. Для самых навороченных и крутых кодеров - используя навыки кодерства и знания android API, средствами 1С наваять свой FTP загрузчик (или выгрузчик, как кому больше по нраву придется). Готовых предложений в таком виде не нашел

2. Для знатоков программирования под андроид - написать свое приложение, которое будет отправлять данные по желанию.

3. Для обычных смертных программистов - напрямую вытекает из пункта 2, взять готовую программу и средствами 1С заставить ее выполнять необходимый функционал.

4. Ждать, пока 1С родит версию, которая умеет FTPСоединение.

Для реализации своей мысли я выбрал вариант 3, о котором, собственно, и буду рассказывать в данной статье.

Для начала была скачана программа AndFtp, принципиальной разницы нет, какую утилиту использовать, но для иной, вероятно, придется править код. Данная программа взята потому, что первой попалась на глаза в гугле.

Собственно, код, который загружает с FTP файл Config.xml и отправляет обратно ConfigRE.xml:

//Загрузка
//Для начала создаем понятный андроиду объект
ОбъектАндроид = Новый ЗапускПриложенияМобильногоУстройства();
//Создаем intent, событие чтобы андроид понял что сейчас будет
ОбъектАндроид.Действие = "android.intent.action.PICK";
//Передаем данные с которыми предстоит работать
ОбъектАндроид.Данные = "ftp://адрес_вашего_сервера:Порт_Вашего_Сервера";
//И сразу же объясняем что это и чем открыть
ОбъектАндроид.Тип = "vnd.android.cursor.dir/lysesoft.andftp.uri";
//Теперь немного параметров для самой программы
ОбъектАндроид.ДополнительныеДанные.Добавить("ftp_username" ,"test");
ОбъектАндроид.ДополнительныеДанные.Добавить("ftp_password" ,"test");
ОбъектАндроид.ДополнительныеДанные.Добавить("ftp_pasv" ,"true");
//Указание команды которую будет выполнять программа
ОбъектАндроид.ДополнительныеДанные.Добавить("command_type" ,"download");
//Чисто декоративная надпись
ОбъектАндроид.ДополнительныеДанные.Добавить("progress_title" ,"load Config");
//Указание файла который следует скачать
//в моем случае он лежит в корне FTP, для других вариантов следует указывать путь вида "/Папка1/Папка2/../Имя_файла"
ОбъектАндроид.ДополнительныеДанные.Добавить("remote_file1" ,"Config.xml");
//И папочка куда скачиваем
ОбъектАндроид.ДополнительныеДанные.Добавить("local_folder" ,"/sdcard/Download");
//Выполняем программу
ОбъектАндроид.Запустить(Ложь);

ОбъектАндроид = Неопределено;

//ВЫгрузка
ОбъектАндроид = Новый ЗапускПриложенияМобильногоУстройства();
ОбъектАндроид.Действие = "android.intent.action.PICK";
ОбъектАндроид.Данные = "ftp://адрес_вашего_сервера:Порт_Вашего_Сервера";
ОбъектАндроид.Тип = "vnd.android.cursor.dir/lysesoft.andftp.uri";

ОбъектАндроид.ДополнительныеДанные.Добавить("ftp_username" ,"test");
ОбъектАндроид.ДополнительныеДанные.Добавить("ftp_password" ,"test");
ОбъектАндроид.ДополнительныеДанные.Добавить("ftp_pasv" ,"true");
//От загрузки выгрузка на FTP отличается только командой и обращением с файлами
ОбъектАндроид.ДополнительныеДанные.Добавить("command_type" ,"upload");
ОбъектАндроид.ДополнительныеДанные.Добавить("progress_title" ,"Upload Config");
//Как видно имя параметров немного отличается от загрузки
//remote_folder указан пустой строкой поскольку файл должен попасть в корень FTP
ОбъектАндроид.ДополнительныеДанные.Добавить("local_file1" ,"/sdcard/Download/ConfigRE.xml");
ОбъектАндроид.ДополнительныеДанные.Добавить("remote_folder" ,"");

ОбъектАндроид.Запустить(Ложь);

Из скользких моментов могу добавить, что код будет выполняться только на стороне клиента, при попытке запуска на сервере не распознается ЗапускПриложенияМобильногоУстройства. При передаче значений в переменные очень критичен регистр в именах.

Для тех, кто хочет большего:

1. Статья, которая дала неоценимую помощь в понимании Сюда

2. Статья, объясняющая, что такое intent в принципе и зачем он нужен Сюда

3. Альтернативный путь решения, тоже с внешней компонентой, ибо без нее не запускается вообще Сюда, почему-то через HTTPЗапрос

4. И, конечно, описание работы AndFtp, видимо на яве, но я не уверен Сюда

Благодарю за внимание.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Михаил Коваль (mihey) 06.11.15 09:49
А не умеет потому что это прошлый век, файлы гонять по ftp, сейчас модно веб-сервисы
2. Arsen r (NekoZver) 06.11.15 10:12
(1) mihey, Старый конь борозды не портит, а мода это понятие быстро проходящее. Не стоит забрасывать удобные интерфейсы если появились новые, к тому же ты не представляешь сколько лабуды на FTP работает, не все такие резвые как ты. Иногда есть просто суровая необходимость.
3. Ruslan (flyer) 06.11.15 11:28
не везде клиенты могут открыть доступ к веб сервису так что пока фтп остается актуальным
NekoZver; +1 Ответить
4. Станислав Р (Byrabyk) 28.06.16 14:04
А сразу несколько файлов можно выгрузить?
5. Arsen r (NekoZver) 02.07.16 08:28
(4) Byrabyk, не побывал, но в описании AndFtp есть вот такой кусочек
And define file(s) to download into a local folder:
intent.putExtra("remote_file1", "/remotefolder/subfolder/file1.zip");
intent.putExtra("remote_file2", "/remotefolder/subfolder/file2.zip");


я думаю будет выглядеть вот так например
ОбъектАндроид.ДополнительныеДанные.Добавить("local_file1" ,"/sdcard/Download/File1.xml");
ОбъектАндроид.ДополнительныеДанные.Добавить("local_file2" ,"/sdcard/Download/File2.xml");
ОбъектАндроид.ДополнительныеДанные.Добавить("local_file3" ,"/sdcard/Download/File3.xml");
6. set5553 KUKA (set5553) 31.07.16 19:09
Что-то не работает этот кусок кода. Все перепробовал
7. rhtr Иванов (rhtr) 19.09.16 09:33
Закрыть "AndFtp" после получения/передачи файлов.

ОбъектАндроид.ДополнительныеДанные.Добавить("close_ui", "true");
NekoZver; +1 Ответить
8. rhtr Иванов (rhtr) 19.09.16 14:45
А вот как удалить файл с FTP ?
9. Arsen r (NekoZver) 17.10.16 11:12
(6) set5553, это который кусок?
(8) rhtr, к великой печали моей не нашел :(
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа