Добрый день!
Я собираюсь поделиться опытом в разработке мобильного приложения средствами 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, видимо на яве, но я не уверен Сюда
Благодарю за внимание.