Так как у мобильного приложения 1С нет HTTP сервисов решил написать свой.
На чем я работал:
1. Android Studio 3.6.2
2. Мобильное приложение 1С 8.3.16.142
3. 1С:Предприятие 8.3 (8.3.17.1386)
Начнем с описания функционала:
// Описание: Функция запускает сервер.
// Параметры:
//Не обязательные.
// Порт - число. Порт который слушает сервер. 8080 по умолчанию.
// Имя, Пароль - строки.
// Если не заполнены значит нет аутентификации
//Возвращает указатель на Сервер - пустая строка ошибка создания.
СтрокаУказатель = Компонента.CreateHttpServer(Порт, Имя, Пароль)
// Описание: функция отвечает на запрос
// Параметры:
// обязательные.
// Сокет- строка. Указатель на клиентский сокет - получается из запрос HTTP
// Не обязательные.
// КодОтвет - СТРОКА. если не заполнено тогда "200"
// Данные - СТРОКА. если не заполнено тогда ""
// Возвращает количество отправленных байт если <= 0 то ошибка.
ОтправленоБайт = Компонента.SendAnswer(Сокет, КодОтвет, Данные)
// Описание: Количество подключенных к серверу клиентов
Число = Компонента.ClientCount;
// Описание: Данные интерфейса IP (только когда запущен сервер)
JSONСтрока = Компонента.IPConfig;
// Описание: Отладка можно посмотреть версию
JSONСтрока = Компонента.InfoString;
1. Подключение стандартное ниже на скрине.
Важно:
Во время настройки Web-публикации следует провести следующее действие. В настройках http-сервера необходимо добавить типы MIME для следующих расширений:
- .so
- .apk
Тип MIME: application/octet-stream
2. Проверим.
2. Написал обработку с двумя кнопками. Запустил на УТ.
код обработки:
Процедура КнопкаВыполнитьPOST(Кнопка)
Попытка
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Штрихкоды.ПредставлениеШтрихкода
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО Штрихкоды.Владелец = Номенклатура.Ссылка
| И НЕ Номенклатура.ЭтоГруппа";
Выборка = Запрос.Выполнить().Выбрать();
// Создаем строку с данные JSON выборка примерно 45000 элементов
JSONДанныеПередачи = СоздатьСтрокуJSON(Выборка);
Если HTTPСоединение = Неопределено Тогда
HTTPСоединение = Новый HTTPСоединение("192.168.0.98", 8080, "Админ", "123");
КонецЕсли;
HTTPЗапрос = Новый HTTPЗапрос("/HTTPTest/Post?Номенклатура=" + КодироватьСтроку(НоменклатураСсылка,СпособКодированияСтроки.КодировкаURL) + "&Индекс=" + Индекс);
//добовляем заголовки к запрос
//к сожеления не поборол руские буквы в заголовках поэтому нужно использовать функцияю КодироватьСтроку
HTTPЗапрос.Заголовки.Вставить(КодироватьСтроку("КомандаЗаголовок",СпособКодированияСтроки.КодировкаURL)
,КодироватьСтроку("Выгружаем номенклатуру",СпособКодированияСтроки.КодировкаURL));
HTTPЗапрос.Заголовки.Вставить(КодироватьСтроку("ДатаЗапроса",СпособКодированияСтроки.КодировкаURL),ТекущаяДата());
HTTPЗапрос.Заголовки.Вставить(КодироватьСтроку("Количество",СпособКодированияСтроки.КодировкаURL),Выборка.Количество());
HTTPЗапрос.УстановитьТелоИзСтроки(JSONДанныеПередачи);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Сообщить(Строка(HTTPОтвет.КодСостояния) + Символы.ПС + HTTPОтвет.ПолучитьТелоКакСтроку());
Индекс = Индекс + 1;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура КнопкаВыполнитьGET(Кнопка)
Попытка
//подключение к нашему серверу
Если HTTPСоединение = Неопределено Тогда
HTTPСоединение = Новый HTTPСоединение("192.168.0.98", 8080, "Админ", "123");
КонецЕсли;
HTTPЗапрос = Новый HTTPЗапрос("/HTTPTest/Get?Номенклатура=" + НоменклатураСсылка + "&Индекс=" + Индекс);
//добовляем заголовки к запрос
//к сожеления не поборол руские буквы в заголовках поэтому нужно использовать функцияю КодироватьСтроку
HTTPЗапрос.Заголовки.Вставить(КодироватьСтроку ("КомандаЗаголовок",СпособКодированияСтроки.КодировкаURL) ,КодироватьСтроку("Родитель",СпособКодированияСтроки.КодировкаURL));
HTTPЗапрос.Заголовки.Вставить(КодироватьСтроку ("ДатаЗапроса",СпособКодированияСтроки.КодировкаURL),ТекущаяДата());
//Выполнили метод
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
//Обработка ответа
Сообщить(Строка(HTTPОтвет.КодСостояния) + Символы.ПС + HTTPОтвет.ПолучитьТелоКакСтроку());
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
3. Написал обработку события на сервере в мобильное приложение 1С.
код обработки:
Процедура ОбработкаВнешнегоСобытия(Источник, Заголовоки, Контент)
Если Источник = "MALhttpserver" Тогда
//Обычное преобразование JSON в сооответсвие заголовков
ДанныеЗапроса = JSONМодуль.СоздатьСтруктуруИзAndroid(Заголовоки, Истина);
//Так как событие асинхронное то и пришлось добавить ид сокета для ответа.
КлиентСокет = ДанныеЗапроса.Получить("ClientSocket");
//Сам запрос
Запрос = ДанныеЗапроса.Получить("Inquiry");
Если Запрос = "HTTPTest/Get" Тогда
//Просто отвечаем
глHTTPServer.SendAnswer(КлиентСокет,"200","Привет я тебя понял)");
ИначеЕсли Запрос = "HTTPTest/Post" Тогда
//Разбераем данные клиента
СтруктураКонтент = JSONМодуль.СоздатьСтруктуруИзAndroid(Контент, Ложь);
//создаем строкуJSON из входного масива
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(ЗаписьJSON, СтруктураКонтент.Номенклатура);
ОтветСтрокаJSON = ЗаписьJSON.Закрыть();
//Отвечаем массивом обратно, а 201 просто так захотелось.
глHTTPServer.SendAnswer(КлиентСокет,"201",ОтветСтрокаJSON);
Иначе
глHTTPServer.SendAnswer(КлиентСокет,"404","Нет токой страници!");
КонецЕсли;
КонецЕсли;
3. Посмотрим точки останова.
В обработке запущенной на УТ нажимаем кнопку "отправить GET запрос" . На сервере(мобильное приложение 1С) возникает внешнее событие:
Сервер отвечает и вот его ответ:
Теперь в обработке запущенной на УТ нажимаем кнопку "отправить POST запрос" . На сервере(мобильное приложение 1С) возникает внешнее событие:
Сервер отвечает и вот его ответ:
4. Ну пожалуй все.
В Архиве исходники на компоненту ,сf , и тестовая обработка . В папке package уже готовый zip для компаненты. Все исходники для android написаны под Android Studio 3.6.2. Все, что нужно, само подгрузится.