Давайте подружим 1С и Android. Часть 2 - авторизуемся в 1С

08.03.16

Разработка - Мобильная разработка

Авторизуемся в 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Архив проекта AndroidStudio
.7z 4,73Mb
81
81 Скачать (1 SM) Купить за 1 850 руб.

Вспомним основную задачу (часть 1):

Задача: Создать приложение, которое позволит осуществлять приемку товара в розничном магазине при перемещении со склада компании.


В этой части:

  • Создадим приложение, кастомизированое под 1С
  • Будем выполнять авторизацию в базе 1С.

Касательно веб-сервисов рассмотрим:

  • Вызов операции сервиса без параметров.
  • Вызов операции сервиса с параметрами примитивного типа.

Начнем

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

Какие осложнения нам это дает:

1) Список пользователей должен быть динамическим

2) Пароли на устройстве хранить нельзя

3) Для обращению к списку пользователей ИБ нужны административные права

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

Создадим:

  • Пользователя "WSuser", который получит логины.
  • Регистр сведений "ПользователиМобильногоКлиента" с одним-единственным измерением "Пользователь", в котором будем хранить список пользователей для авторизации на мобильном клиенте
  • XDTO-пакет "AcceptingOrdersPackage" с URI "AcceptingOrdersService"
  • Веб-серис "AcceptingOrders", определим 2 операции "GetLoginList" и "Login" первая, соответственно, будет получать список пользователей, вторая проверять имя пользователя и пароль.
  • Роль "СлужебныйПользовательМобильногоКлиента", у которой есть доступ к обеим операциям сервиса, право чтения регистра "ПользователиМобильногоКлиента" и справочника "Пользователи", право администрирования.

Теперь наш пакет и веб-сверис имеют такой вид:

 

 

Операция GetLoginList:

Функция GetLoginList()

	Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПользователиМобильногоКлиента.Пользователь.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ,
	|	ПользователиМобильногоКлиента.Пользователь.Наименование КАК Наименование
	|ИЗ
	|	РегистрСведений.ПользователиМобильногоКлиента КАК ПользователиМобильногоКлиента");
	Выборка = Запрос.Выполнить().Выбрать();
	
	xdtoТипОтвета = ФабрикаXDTO.Тип("AcceptingOrdersService", "LoginList");
	xdtoТипЛогин = ФабрикаXDTO.Тип("AcceptingOrdersService", "Login");
	xdtoОтвет = ФабрикаXDTO.Создать(xdtoТипОтвета);	
	
	Пока Выборка.Следующий() Цикл
		Если Не ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ) Тогда
			Продолжить;
		КонецЕсли;	
		xdtoЛогин = ФабрикаXDTO.Создать(xdtoТипЛогин);
		xdtoЛогин.Description = Выборка.Наименование;
		xdtoЛогин.ID = Строка(Выборка.ИдентификаторПользователяИБ);
		xdtoОтвет.Login.Добавить(xdtoЛогин);
	КонецЦикла;	
	
	Возврат xdtoОтвет;
		
КонецФункции

Операция Login:

Функция Login(ID, Password)

	xdtoТипОтвета = ФабрикаXDTO.Тип("AcceptingOrdersService", "LoginResult");
	xdtoОтвет = ФабрикаXDTO.Создать(xdtoТипОтвета);	
	xdtoОтвет.Name = "";
	
	ИдентификаторПользователя = Новый УникальныйИдентификатор(ID);	
	ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователя);
	Если ПользовательИБ <> Неопределено
		И ПользовательИБ.СохраняемоеЗначениеПароля = СтрЗаменить(Password, Символы.ПС, "") Тогда
		
		xdtoОтвет.Name = ПользовательИБ.Имя;
		xdtoОтвет.Result = Истина;
		Возврат xdtoОтвет;
		
	КонецЕсли;
	
	xdtoОтвет.Result = Ложь;
	Возврат xdtoОтвет;
	
КонецФункции

Серверная часть готова, переходим к Android

В файлах есть архив с проектом для Android Studio, если необходимо. Весь код выкладывать будет излишним, буду разбирать только самое необходимое

Далее не претендую на грамотность объяснений и оптимальность кода, расскажу как понимаю сам, проводя иногда аналоги с 1С.

Что важно понимать при программировании обращения к сетевым ресурсам:

В андроид (Java) есть понятие потоков , параллельно работающих процессов. Основной поток программы управляет главной активностью (окно программы по-простому) и нельзя в основном потоке выполнять действия, которые будут "занимать" его. Таким образом, для обращения к веб-сервису мы должны создать дополнительный поток, Thread (я бы сказал, что это очень похоже на фоновое задание). Для того, чтобы получить ответ используется обработчик, Handler (как ОбработкаОповещения).

То есть мы создаем параллельный поток и просто ждем ответа от него. Это можно сравнить с подбором товара в табличную часть документа - при нажатии кнопки открывается общая форма, но при этом форма документа продолжает работать в обычном режиме. А при выборе строки в форме подбора срабатывает обработчик оповещения, в параметры которого передается строка.

Рассмотрим основной класс - MainActivity

Опустим описание переменных кроме трех:

public static final int ACTION_ConnectionError = 0;
public static final int ACTION_GetLoginList = 1;
public static final int ACTION_Login = 2;

Это вспомогательные переменные, имеющие фиксированное значение.

1) Обработчик создания

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Инициализируем вспомогательный класс
uiManager = new UIManager(this);
// Инициализируем менеджер настроек
preferences = PreferenceManager.getDefaultSharedPreferences(this);
// Читаем идентификатор последнего выбранного пользователя из настроек
wsParam_LoginID = preferences.getString("LoginID", "");
// Читаем настройки подключения
initiateConnectionSettings();
// Инициализируем обработчик ответа от сервиса
soapHandler = new incomingHandler(this);

if (soapParam_URL.equals(""))
// Первый запуск, открываем настройки
openSettings();
else {
// Выводим на экран форму авторизации
setContentView(R.layout.activity_main);
// Запрашиваем список пользователей
startExchange(ACTION_GetLoginList);
}
}

Думаю, комментарии излишни

2) Класс для обработки сообщений от сервиса (от параллельного потока)

private static class incomingHandler extends Handler {

private final WeakReference<MainActivity> mTarget;

// Конструктор
public incomingHandler(MainActivity context){
mTarget = new WeakReference<>(context);
}

@Override
public void handleMessage(Message msg) {

MainActivity target = mTarget.get();
switch (msg.what) {
case ACTION_ConnectionError:
uiManager.showToast("Ошибка" + getSoapErrorMessage());
break;
case ACTION_GetLoginList:
target.initiateLoginList();
break;
case ACTION_Login:
target.checkLoginResult();
break;
}

}
}

Метод "handleMessage" как раз выполняет обработку сообщения, тело сообщения - msg.what. В зависимости от значения выполняем обработку. Как мы видим, при получения сообщения об ошибке соединения, выводится сообщение. О том как оно формируется - ниже.

3) Обработчик заполнения списка пользователей после получения ответа от сервиса

protected void initiateLoginList(){

ArrayList<String> loginList = new ArrayList<>();
loginIDList = new ArrayList<>();

int count = soapParam_Response.getPropertyCount();
int position = 0;

for (int i = 0; i < count; i++) {
SoapObject login = (SoapObject) soapParam_Response.getProperty(i);
String name = login.getPropertyAsString("Description");
String id = login.getPropertyAsString("ID");
loginList.add(name);
loginIDList.add(id);

if (wsParam_LoginID.equals(id)){
position = i;
}

}

ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.spinner_user, loginList);

Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setPrompt("Выберите пользователя");
spinner.setAdapter(adapter);
spinner.setSelection(position);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
saveUserID(position);
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});

}

Давайте обратим внимание на цикл:

 int count = soapParam_Response.getPropertyCount();
int position = 0;

for (int i = 0; i < count; i++) {
SoapObject login = (SoapObject) soapParam_Response.getProperty(i);
String name = login.getPropertyAsString("Description");
String id = login.getPropertyAsString("ID");
loginList.add(name);
loginIDList.add(id);

if (wsParam_LoginID.equals(id)){
position = i;
}

}

В 1С в xdto пакете мы определили тип "LoginList" со свойством типа "Login" и переменная "soapParam_Response" - ответ от сервиса типа "LoginList". Если в отладке 1С мы попытаемся посмотреть свойства пакета, то будет одно свойство типа "Login" и в нем только несколько экземпляров. Это несколько искажает представление о том, как работать с xdto в Android. Тут же у пакета "soapParam_Response" столько свойств с именем "Login", сколько экземпляров мы в него добавили в 1С. То есть у нас count логинов и мы столько же свойств и получаем - getProperty(i). Если бы в пакете были свойства другого типа, нам пришлось бы проверять имя свойства. В дальнейшем такие моменты тоже разберем.

Сам же экземпляр списка, полученный методом getProperty(i) имеет тип так же SoapObject. Его поля имеют строковый тип и получаются так - getPropertyAsString("Description").

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

4) Обработчик авторизации

public void checkLoginResult(){

Boolean isLoginSuccess = Boolean.parseBoolean(soapParam_Response.getPropertyAsString("Result"));

if (isLoginSuccess){
soapParam_user = soapParam_Response.getPropertyAsString("Name");
EditText wsParam_Password = (EditText) findViewById(R.id.wsParam_Password);
soapParam_pass = wsParam_Password.getText().toString();
setActivityTaskList();
}
else
uiManager.showToast("Ошибка! Неверно введен пароль");

}

Обратите внимание на то, как мы получаем реквизит типа булево - приходится парсить его из строки. Так же можно воспользоваться методом "getPrimitiveProperty". Аналогично с данными типа число.

5) Обработчик разбора ошибок сервиса

private static String getSoapErrorMessage () {

String errorMessage;

if (responseFault == null)
errorMessage = "Отсутствует соединение с сервером.";
else{
try {
errorMessage = responseFault.faultstring;
}
catch (Exception e) {
e.printStackTrace();
errorMessage = "Неизвестная ошибка.";
}
}

return errorMessage;
}

В случае ошибки при вычислении на стороне 1С в responseFault.faultstring будет полное описание ошибки.

6) Вызов операции веб-сервера

protected void startExchange(int ACTION){

SOAP_Dispatcher dispatcher = new SOAP_Dispatcher(soapParam_timeout, soapParam_URL, soapParam_user, soapParam_pass, ACTION);
dispatcher.start();

}

В качестве параметра передается переменная ACTION - номер операции для вызова сервиса.

 

Рассмотрим класс SOAP_Dispatcher - это основной класс для работы с сервисом 1С

public class SOAP_Dispatcher extends Thread {

int timeout;
String URL;
String user;
String pass;
int ACTION;
SoapObject soap_Response;
final String NAMESPACE = "AcceptingOrdersService";

public SOAP_Dispatcher(int soapParam_timeout, String soapParam_URL, String soapParam_user, String soapParam_pass, int SOAP_ACTION){
timeout = soapParam_timeout;
URL = soapParam_URL;
user = soapParam_user;
pass = soapParam_pass;
ACTION = SOAP_ACTION;
}

@Override
public void run() {

switch (ACTION) {
case MainActivity.ACTION_GetLoginList:
GetLoginList();
break;
case MainActivity.ACTION_Login:
Login();
break;
}

if (soap_Response != null) {
MainActivity.soapParam_Response = soap_Response;
MainActivity.soapHandler.sendEmptyMessage(ACTION);
} else {
MainActivity.soapHandler.sendEmptyMessage(MainActivity.ACTION_ConnectionError);
}

}

void GetLoginList(){

String method = "GetLoginList";
String action = NAMESPACE + "#AcceptingOrders:" + method;
SoapObject request = new SoapObject(NAMESPACE, method);
soap_Response = callWebService(request, action);

}

void Login(){

String method = "Login";
String action = NAMESPACE + "#AcceptingOrders:" + method;
SoapObject request = new SoapObject(NAMESPACE, method);
request.addProperty("ID", MainActivity.wsParam_LoginID);
request.addProperty("Password", MainActivity.wsParam_PassHash);
soap_Response = callWebService(request, action);

}


private SoapObject callWebService(SoapObject request, String action){

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.dotNet = true;
envelope.implicitTypes = true;
HttpTransportSE androidHttpTransport = new HttpTransportBasicAuthSE(URL, user, pass, timeout);
androidHttpTransport.debug = true;

try {
androidHttpTransport.call(action, envelope);
return (SoapObject) envelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
MainActivity.responseFault = (SoapFault) envelope.bodyIn;
}

return null;
}

}

Здесь:
NAMESPACE - пространство имен, заданное в 1С
timeout,
URL,user,pass - параметры подключения
public
SOAP_Dispatcher - конструктор класса
run() - обработчик, срабатываемый при вызове метода start() экземпляра класса (смотри 6) Вызов операции веб-сервера)

Далее следуют как раз вызовы операций веб-сервисов:

void GetLoginList(){

String method = "GetLoginList";
String action = NAMESPACE + "#AcceptingOrders:" + method;

SoapObject request = new SoapObject(NAMESPACE, method);

soap_Response = callWebService(request, action);

}

Здесь:

  • method - имя операции веб сервиса как в 1С
  • AcceptingOrders - имя сервиса
  • request - вспомогательная переменная
  • callWebService - служебный метод, его можно просто скопировать.
  • soap_Response - ответ от сервиса.


Обратите внимание: переменная soap_Response имеет тип SoapObject, как и метод callWebService. Если операция веб-сервиса будет возвращать ответ примитивного типа - string или boolean, то ответ будет типа SoapPrimitive и для таких операций нужны отдельные методы и переменные.

void Login(){

String method = "Login";
String action = NAMESPACE + "#AcceptingOrders:" + method;

SoapObject request = new SoapObject(NAMESPACE, method);
request.addProperty("ID", MainActivity.wsParam_LoginID);
request.addProperty("Password", MainActivity.wsParam_PassHash);

soap_Response = callWebService(request, action);

}

Это уже вызов операции с параметрами. Ничего сложного нет, параметр вставляется так:

request.addProperty("ID", MainActivity.wsParam_LoginID);

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

Пароли

Теперь еще раз о паролях. Повторим то, с чего начали - мы имеем устройство не персональное, то есть любой пользователь должен иметь возможность авторизоваться с любого устройства. Понятно, что для удобства список пользователей должен быть доступен на устройстве, для этого мы придумали служебного пользователя. Как же поступаем дальше?

Вот мы ввели пароль, теперь выполним проверку. В 1С у пользователя ИБ есть свойство "СохраняемоеЗначениеПароля" которое составляется следующим образом: вычисляется хеш-функция SHA1 от пароля и через запятую хеш-функция от пароля в верхнем регистре. Из соображений безопасности нам этот хеш надо вычислять на мобильном устройстве. Для работы с текстом есть отдельный класс Parser_Text

Вот метод, вычисляющий хеш от пароля:

public static String getPassHash(String text){ 

return base64string(sha1(text)) + "," + base64string(sha1(text.toUpperCase()));

}

И уже далее если хеш пароля совпадает с хранимым в 1С, мы продолжаем работу с сервисом, но не с логином WSuser, а уже под выбранным пользователем. Для этого операция Login возвращает нам результат проверки пароля и имя пользователя для входа.

Кастомизация

Далее не относящееся к веб-серсиам. Сделаем наше приложение более-менее похожим на 1С:

 

 

 

Чтобы все элементы управления были одинаковыми без вмешательства разработчика, в файле Styles.xml описываем стили.

<style name="AppTheme" parent="android:Theme.NoTitleBar.Fullscreen">
<item name="android:textViewStyle">@style/textViewStyle</item>
<item name="android:editTextStyle">@style/editTextStyle</item>
<item name="android:spinnerStyle">@style/spinnerStyle</item>
<item name="android:windowBackground">@color/form</item>
</style>

<style name="textViewStyle" parent="android:Widget.TextView">

<item name="android:textColor">@color/text</item>
<item name="android:textSize">@dimen/textsize</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginTop">@dimen/layout_vertical_margin</item>
<item name="android:paddingBottom">@dimen/element_vertical_padding</item>
<item name="android:paddingTop">@dimen/element_vertical_padding</item>
<item name="android:paddingLeft">@dimen/element_horizontal_padding</item>
<item name="android:paddingRight">@dimen/element_horizontal_padding</item>

</style>

<style name="editTextStyle" parent="android:Widget.EditText">

<item name="android:textColor">@color/text</item>
<item name="android:textSize">@dimen/textsize</item>
<item name="android:background">@drawable/edit</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginTop">@dimen/layout_vertical_margin</item>
<item name="android:singleLine">true</item>

</style>

<style name="spinnerStyle" parent="android:Widget.Spinner">

<item name="android:textColor">@color/text</item>
<item name="android:textSize">@dimen/textsize</item>
<item name="android:background">@drawable/spinner</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:dropDownWidth">wrap_content</item>

</style>

Все необходимые ресурсы есть в архиве с проектом.

 

В следующей части:

  • Поработаем с последовательностью xdto (ПоследовательностьXDTO в 1С)
  • Посканируем при помощи камеры устройства
  • Вызовем операцию сервиса с параметром типа xdtoОбъект.

Каждый раз я буду выкладывать архив проекта, если нет необходимости - не качайте

См. также

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 1С:Конвертация данных Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 руб.

27.12.2021    38229    108    161    

201

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

3000 руб.

03.12.2018    59315    192    103    

172

Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Простой мобильный ТСД (терминал сбора данных) сканер для 1С для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    97278    587    189    

321

Логистика, склад и ТМЦ Сканер штрих-кода Терминал сбора данных Мобильная разработка Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

3450 руб.

28.04.2023    9482    15    0    

9

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Финансовые услуги, инвестиции Управленческий учет Платные (руб)

Мобильное приложение и конфигурация 1С для автоматической торговли на бирже через API Тинькофф банка. Достаточно задать настройки, нажать «Пуск», и робот сам торгует ежедневно.

7000 руб.

25.05.2022    4655    1    0    

6

Мобильная разработка WEB-интеграция Программист Мобильная платформа Абонемент ($m)

Экспериментальный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между устройствами Simple и между Simple и бек-системами (например 1С). По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок для поддержки стабильного постоянного соединения, докачки больших файлов и работе в фоне. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

23.08.2024    1219    6    informa1555    1    

13

Мобильная разработка Мобильная платформа Абонемент ($m)

В этом релизе собрано много нового из области интерфейса, связи, хранения и важные новые способы управления. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

25.06.2024    2619    29    informa1555    0    

33
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. infosoft-v 927 08.03.16 19:24 Сейчас в теме
Отличная статья. Спасибо.
2. Ann.prog1C 08.03.16 21:48 Сейчас в теме
3. flyer 233 09.03.16 07:33 Сейчас в теме
продолжайте слежу за темой
4. gudun_ku 62 09.03.16 09:28 Сейчас в теме
Отличная статья. Код под Андроид хорош, оценил, что легко переложить на net cf, чем я и займусь как-нибудь. Жду продолжения, про сканирование.
5. Ibrogim 1327 09.03.16 09:49 Сейчас в теме
Вот теперь ставлю плюс.

Вы кстати вдохновили меня тоже статью написать)
6. WKBAPKA 215 09.03.16 10:30 Сейчас в теме
о, отличная статья. спасибо
7. Yashazz 4791 09.03.16 16:14 Сейчас в теме
Вообще не очень понимаю, нафига это всё... Мобильное приложение - кривоватое побочное дитя попытки 1С угнаться за модой, которое однажды канет в прошлое, как веб-расширения и тому подобная мутота... Охота вам силы тратить.
8. solarisman 149 09.03.16 20:31 Сейчас в теме
(7) Yashazz, Не понял, при чем тут мобильное приложение 1С? Приложение нативное, написанное на Java. По поводу
канет в прошлое
- дык все в прошлое канет, что же теперь, ничего не делать? Google задумывается переходить с Java и заглядывается на другие языки. Никто же разработку не бросает.
Designer1C; +1 Ответить
9. dj_serega 393 10.03.16 08:15 Сейчас в теме
10. solarisman 149 10.03.16 09:00 Сейчас в теме
(9) dj_serega, Вообще не понял, о чем речь здесь? HTTP - протокол передачи данных, SOAP - протокол доступа к объектам, который использует HTTP.
11. solarisman 149 10.03.16 09:36 Сейчас в теме
Коллеги, давайте по существу, хочется конструктивной критики.
13. DitriX 2101 11.03.16 09:54 Сейчас в теме
(11) тут говорить особо не очем, то о чем вы пишете - говорили еще в 2012 году :)
Лучше вы не написали, чем было, новые механизмы (http реквесты, odata, json) - не использовали. И я в упор не пойму почему.
Как учебный материал - ваши статьи вобщем то тоже бесполезны (ИМХО). Это скорее смахивает на записки самому себе. А люди ставят плюсы просто потому что тут 1С+Андроид :)

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

P.S. Без обид, просто от таких статей все 1С ники и думают, что другие языки и направления - очень сложны в освоении.
dj_serega; +1 3 Ответить
14. solarisman 149 11.03.16 10:41 Сейчас в теме
(13) DitriX, А на что обижаться, все правильно написано.
Конечно, мне до ваших статей далеко, но и на фурор я не рассчитывал.
19. DitriX 2101 12.03.16 06:15 Сейчас в теме
(14) Ни в коем случае я не пытаюсь тут устроить дедовщину.
Наоборот, если вы таки хотите сделать качественные статьи и для себя новое узнать, то я готов вам даже помочь с написанием, т.е. подсказать что лучше писать, в каком виде подавать и т.д.
Просто обидно смотреть когда люди тратят свое время на написание сомнительных вещей.
Поэтому если вы заинтересованы написать такой цикл статей - то добро пожаловать ко мне в личку.

(17) (http реквесты, odata, json) оно лучше, но у каждого своя задача.

Вобщем если решите таки что то сделать из реально актуальных вещей - я готов вам помочь, я не жадный, у меня уже и так пол инфостарта в скайпе :)
15. Yashazz 4791 11.03.16 17:19 Сейчас в теме
(13) DitriX, а ещё от таких статей на ровном месте растёт "рейтинг"))) И потом начинаются распальцовки)
17. solarisman 149 11.03.16 22:14 Сейчас в теме
(15) Yashazz, Ладно, ладно, еще одну статью напишу в завершение и все, честно-честно. А то ишь, покусился на святой рейтинг топ-авторов.
Вот честно, как дети. Напишите то же самое приложение с использованием
(http реквесты, odata, json)
покажите что оно лучше во всем и тогда я скажу что я опозорился и статьи удалю вообще
21. WKBAPKA 215 15.03.16 10:01 Сейчас в теме
(13) DitriX, я поддержу автора. Для меня, как человека, который изучает Андроид, эта статья очень полезна. Меня больше интересует не подача текста, а примеры, которые автор очень любезно выложил.
44. Denzip 22.03.19 22:52 Сейчас в теме
(11)отличная статья. Какая тут критика?
Я давно искал способ написать интернет магазин со связью 1с. По ходу нашёл точку опоры!
Огромное Вам спасибо за труды. Это многого стоит
12. Nenaviju1C 10.03.16 11:05 Сейчас в теме
Нечто подобное тоже себе организовал:
База (если так можно сказать) 1с - самописная конфиг-я для формирования ежемесячных отчетов по счетчикам гор/хол воды для ЖКХ с рассылкой определенную дату по регламенту от своего имени (*@mail.ru) на почту ЖКХ.

Мобильное приложение написано на java (Android Studio). Транспорт использую тот же - WS (soap).
Писал ЭТО для себя от нечего делать :) ... да и надоело счета собирать в папке на компе вручную ))

По потоку:
Из базы передается список XDTO состоящий из GUID "документа-отчета" и даты отчета.
Каждая строка содержит список XDTO (номер счетчика + замеры до и после)

На приложении:
Всего 3 layout:настройки, список документов, детализация по документу (она же регистрация).
Можно было и динамически клепать их, но лениво все описывать было да и отлавливать баги потом :)

При открытии layouta документа (в т.ч. и нового) уже установлены номера счетчиков - только надо внести показания и все.
Как то так ...

Мобильное приложение - кривоватое побочное дитя попытки 1С угнаться за модой, которое однажды канет в прошлое, как веб-расширения и тому подобная мутота...

Что за консерватизм?? Мобильные устройства в бизнесе используются все больше и больше.
"Мутота" - это для тех кто не знает КАК.
16. Yashazz 4791 11.03.16 17:21 Сейчас в теме
(12) Nenaviju1C,
Что за консерватизм?? Мобильные устройства в бизнесе используются все больше и больше.
"Мутота" - это для тех кто не знает КАК.

Ясно. Внимательно читать не умеете. Я же не про мобильные устройства "вообще" написал. Я про мобильное приложение 1С. И кое-что о перспективах оного знаю.
18. solarisman 149 11.03.16 22:34 Сейчас в теме
(16) Yashazz,
И кое-что о перспективах оного знаю.

Поделитесь секретом-то. А то я понять не могу, почему у нас региональный пищевой холдинг автоматизируется на мобильной платформе.
20. CheBurator 2712 12.03.16 06:54 Сейчас в теме
(18) как заавтоматизируется и выйдет в плановую работу - отпишитесь. порадуемся или поплачем вместе...
22. mkostya 30 24.03.16 18:24 Сейчас в теме
Все отлично, заработало. Жду следующей статьи.
Там будет и критика и предложения))
23. solarisman 149 30.03.16 15:29 Сейчас в теме
(22) Значит буду делать работу над ошибками :)

Постараюсь написать статью 2-3 числа, был в командировке и все не разберусь с текущими задачами
24. agent00mouse 256 14.03.17 08:26 Сейчас в теме
2-3 Апреля? Долго, ну да ладно, ждём. Пилю приложение на базе 1С мобильного приложения, Да, функционал/идею протестировать годно, что серьёзнее и удобнее - нативный Java ведра нужен. т.ч. жду следующей статьи. Спасибо за разработку.
И вопрос, soap конечно удобна, сам через неё работаю, но быстрее и главное проще же дёргать 1С за URL через HTTPСервисы, и как решается вопрос безопасного подключения(ssl)?
Кому интересно, HTTPСервисы (I5-2500 (3,3GHz), 8Gb RAM, Пустая процедура ответа ~ 20000 подключений одновременно, с живой процедурой думаю цифра просядет)
25. user706108_prog 02.05.17 16:20 Сейчас в теме
Если в 1С не создавать пакет XDTO, то из мобильного приложения нельзя будет подсоединиться к веб-сервису 1С? В чем суть пакета XDTO?
Тимур, а Вы в своем мобильном приложении какие библиотеки используете?
ksoap2 используете или нет?
26. Serg O. 297 11.08.17 15:33 Сейчас в теме
главная идея вообще - БОМБА!
1) мобильная платформа 1С - не нужна вообще!

2) вместо этого - делаем красивое и простое приложение...
в среде разработки - Android Studio

3) с 1С - "общаемся" через web-сервисы 1С (или другие запросы кому как нравится)

со стороны 1С - всё понятно, делаем web-сервисы и публикуем на "где-нибудь"

мы тоже до этого "дошли" не так давно... один чел. у нас на Android Studio пишет
другой - web-сервисы для него клепает...

для программистов 1С - конечно трудновато "вспониминать" универ - создавать классы, методы, java язык с кучей скобок,
вспоминать основы ООП...
но визуальная среда - Android Studio - достаточно легка и интуитивно-понятна и многие вещи делаются по щелчку мыши
в youtube - есть циклы обучения по Android Studio - я пару вечеров посидел... и вроде "вкурил" тему...

Более того, Android Studio имеет автоматическую синхронизацию проекта в github
Предлагаю проект выложить в Github - и далее там развивать эту тему...

для "живого" проекта - наверное все-таки лучше приглашать отдельного java-программиста
alkostyuk; +1 Ответить
27. WKBAPKA 215 11.08.17 19:07 Сейчас в теме
(26) круто конечно пишешь, но не все там просто в этом Андроид ;)
все же Андроид будет покруче и посложнее 1С в изучении :)
и поверь, сам язык Java фигня, а вот API изучить, приемы работы....
за пару дней вьехать, это ты конечно немножечко преувеличил
28. WKBAPKA 215 11.08.17 19:08 Сейчас в теме
(26) а что там в студио по щелчку мыши можно сделать?
layout-файл создать?
;)
29. WKBAPKA 215 11.08.17 19:09 Сейчас в теме
(26) мобильная платформа знаешь где нужна, когда тебе надо сделать приложение со всеми этими иерархическими справочниками и т.п.
поверь, на андроид ты таких готовых view не найдешь ... в этом сила мобильного приложения.
а если тебе надо написать приложени чисто под андроид и специфичное, то согласен, мобильная платформа тут не нужна
silberRus; +1 Ответить
30. silberRus 73 12.09.17 11:50 Сейчас в теме
Поставил плюс.

Пожелание:

- сделать на http сервисе, через rest+json. SOAP + XML все таки громоздкий, как по отношению к данным так и по отношению к реализации.
- добавить юнит тесты
49. WKBAPKA 215 01.11.19 12:38 Сейчас в теме
31. ECartman 2 12.02.18 11:34 Сейчас в теме
Настроил сервер 1с по инструкции. Скачал проект для Android. Теперь если я захожу браузером по ссылке, то получаю xml файл - т.е. вроде со стороны 1с все работает. Но вот если запускаю apk на андроиде то получаю сообщение "невозможно соединиться с сервером". Подскажите куда копать?
32. ECartman 2 12.02.18 12:58 Сейчас в теме
(31) В классе MainActivity
в параметрах подключения проставляю

public void saveSettings(View v){

    soapParam_server    = etSoapServer.getText().toString();
    soapParam_database  = etSoapDatabase.getText().toString();
    soapParam_user      = etSoapUser.getText().toString();
    soapParam_pass      = etSoapPass.getText().toString();
    soapParam_timeout   = Integer.parseInt(etSoapTimeout.getText().toString());
    soapParam_URL       = "http://" + soapParam_server + "/" + soapParam_database + "/ws/AcceptingOrders.1cws?wsdl";

    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("server", soapParam_server);
    editor.putString("database", soapParam_database);
    editor.putString("user", soapParam_user);
    editor.putString("pass", soapParam_pass);
    editor.putString("URL",        soapParam_URL);
    editor.putInt("timeout", soapParam_timeout);
    editor.apply();

    setContentView(R.layout.activity_main);
    startExchange(ACTION_GetLoginList);

}

protected void initiateConnectionSettings(){

    soapParam_server    = preferences.getString("server", "192.168.0.25");
    soapParam_database  = preferences.getString("database", "AcceptingOrders");
    soapParam_user      = preferences.getString("user", "WSUser");
    soapParam_pass      = preferences.getString("pass", "1234");
    soapParam_URL       = preferences.getString("URL", "http://192.168.0.25/AcceptingOrders/ws/AcceptingOrders.1cws?wsdl");
    soapParam_timeout   = preferences.getInt("timeout", 10);

}
Показать
33. ECartman 2 12.02.18 13:08 Сейчас в теме
(32) Если обращаться через браузер к урлу "http://192.168.0.25/AcceptingOrders/ws/AcceptingOrders.1cws?wsdl", то получаю следующий xml- файл

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="AcceptingOrders" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="AcceptingOrdersService" xmlns:xsd2="AcceptingOrders" name="AcceptingOrders" targetNamespace="AcceptingOrders">
<types>
<xs:schema xmlns:tns="AcceptingOrdersService" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="AcceptingOrdersService" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="Login">
<xs:sequence>
<xs:element name="ID"/>
<xs:element name="Description"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LoginList">
<xs:sequence>
<xs:element name="Login"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LoginResult">
<xs:sequence>
<xs:element name="Result"/>
<xs:element name="Name"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs1="AcceptingOrdersService" xmlns:xs2="AcceptingOrders" targetNamespace="AcceptingOrders" elementFormDefault="qualified">
<xs:import namespace="AcceptingOrdersService"/>
<xs:element name="GetLoginList">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
<xs:element name="GetLoginListResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="return" type="xs1:LoginList"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Login">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element name="Password" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="LoginResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="return" type="xs1:Login"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</types>
<message name="GetLoginListRequestMessage">
<part name="parameters" element="tns:GetLoginList"/>
</message>
<message name="GetLoginListResponseMessage">
<part name="parameters" element="tns:GetLoginListResponse"/>
</message>
<message name="LoginRequestMessage">
<part name="parameters" element="tns:Login"/>
</message>
<message name="LoginResponseMessage">
<part name="parameters" element="tns:LoginResponse"/>
</message>
<portType name="AcceptingOrdersPortType">
<operation name="GetLoginList">
<input message="tns:GetLoginListRequestMessage"/>
<output message="tns:GetLoginListResponseMessage"/>
</operation>
<operation name="Login">
<input message="tns:LoginRequestMessage"/>
<output message="tns:LoginResponseMessage"/>
</operation>
</portType>
<binding name="AcceptingOrdersSoapBinding" type="tns:AcceptingOrdersPortType">
<soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLoginList">
<soapbind:operation style="document" soapAction="AcceptingOrders#AcceptingOrders:GetLoginList"/>
<input>
<soapbind:body use="literal"/>
</input>
<output>
<soapbind:body use="literal"/>
</output>
</operation>
<operation name="Login">
<soapbind:operation style="document" soapAction="AcceptingOrders#AcceptingOrders:Login"/>
<input>
<soapbind:body use="literal"/>
</input>
<output>
<soapbind:body use="literal"/>
</output>
</operation>
</binding>
<binding name="AcceptingOrdersSoap12Binding" type="tns:AcceptingOrdersPortType">
<soap12bind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLoginList">
<soap12bind:operation style="document" soapAction="AcceptingOrders#AcceptingOrders:GetLoginList"/>
<input>
<soap12bind:body use="literal"/>
</input>
<output>
<soap12bind:body use="literal"/>
</output>
</operation>
<operation name="Login">
<soap12bind:operation style="document" soapAction="AcceptingOrders#AcceptingOrders:Login"/>
<input>
<soap12bind:body use="literal"/>
</input>
<output>
<soap12bind:body use="literal"/>
</output>
</operation>
</binding>
<service name="AcceptingOrders">
<port name="AcceptingOrdersSoap" binding="tns:AcceptingOrdersSoapBinding">
<documentation>
<wsi:Claim xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/" conformsTo="http://ws-i.org/profiles/basic/1.1"/>
</documentation>
<soapbind:address location="http://192.168.0.25/AcceptingOrders/ws/AcceptingOrders.1cws"/>
</port>
<port name="AcceptingOrdersSoap12" binding="tns:AcceptingOrdersSoap12Binding">
<soap12bind:address location="http://192.168.0.25/AcceptingOrders/ws/AcceptingOrders.1cws"/>
</port>
</service>
</definitions>
Показать
34. WKBAPKA 215 12.02.18 14:50 Сейчас в теме
 @Override
    protected String doInBackground(Void... voids) {
        try {

            DataXML.append("Подключение к серверу ...");
            sendMessage(MainActivity.STATUS_MESSAGE);

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            request.addProperty("IDLogin",mlogin);
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);
            //envelope.dotNet = true;
            //envelope.implicitTypes = true;
            HttpTransportSE androidHttpTransport = new HttpTransportBasicAuthSE(URL, "pass", "pass");
            androidHttpTransport.debug = true;
            try {
                DataXML.append("Получение данных ...");
                sendMessage(MainActivity.STATUS_MESSAGE);

                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject resultRequestSOAP = (SoapObject) envelope.bodyIn;
                //Log.d(LOG_TAG, resultRequestSOAP.toString());
                return envelope.getResponse().toString();
                //return resultRequestSOAP.toString();
            }catch (Exception e){
                DataXML.append("Ошибка при получении данных <" + e.toString() + ">");
                sendMessage(MainActivity.STATUS_ERR);
//                e.printStackTrace();
            }


        }catch (Exception e) {
            DataXML.append("Ошибка при подключении к серверу <"+ e.toString() + ">");
            sendMessage(MainActivity.STATUS_ERR);
//            Log.d(LOG_TAG,e.toString());
//            e.printStackTrace();
        }
        return "";
    };

Показать


рабочий код из моего проекта
35. ECartman 2 12.02.18 16:07 Сейчас в теме
(34)
рабочий код из моего проекта


Прошу прощения, это модификация этого проекта или это кусок кода из Вашего проекта? Просто не понимаю, как это может быть для меня полезно? В какой класс это нужно вставить и откуда нужно вызывать функцию "doInBackground"? Просто у меня проблема с подключением. Андроид просто не может обратиться к серверу. Библиотеку ksoap2 я качал jar и подключал через меню file->project structure->dependies.
36. WKBAPKA 215 12.02.18 19:41 Сейчас в теме
Вы можете убрать лишнее и использовать в своем проекте. Я скопировал код реализации получения данных с помощью класса AsynkTask . За основу брал пример из этой статьи.
37. WKBAPKA 215 12.02.18 19:42 Сейчас в теме
Проект мой, рабочий. Ещё обратите внимание на релиз платформы 1С. Проверять работу веб сервиса советую другими средствами.
38. WKBAPKA 215 12.02.18 20:22 Сейчас в теме
39. WKBAPKA 215 13.02.18 11:17 Сейчас в теме
Еще обратите внимание, что на 1С:Предприятие 8.3 (8.3.9.1850) работать не будет, нужно ставить свежее платформу
40. zoytsa 09.02.19 06:48 Сейчас в теме
Коллеги, запутался с создагнием XDTO-пакета.
Как LoginList создать, состоящий из Login?

Вот так пробую (и еще много как):
<xs:schema xmlns:tns="AcceptingOrdersService" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="AcceptingOrdersService" attributeFormDefault="unqualified" elementFormDefault="qualified">
	<xs:complexType name="Login">
		<xs:sequence>
			<xs:element name="ID"/>
			<xs:element name="Description"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="LoginList">
		<xs:sequence>
			<xs:element name="Login" type="tns:Login"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="LoginResult">
		<xs:sequence>
			<xs:element name="Result"/>
			<xs:element name="Name"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>
Показать
41. user966277 2 25.02.19 09:23 Сейчас в теме
(0)Здравствуйте помогите вывести qr-код в табличный документ

&НаКлиенте
Процедура печатькода(Команда)
	ТабДок1=внешнийQR();
	Если ТабДок1<>Ложь Тогда
		ТабДок1.Показать();
	КонецЕсли;

КонецПроцедуры




&Наклиенте
Функция внешнийQR()

	

    
#Если МобильноеПриложениеКлиент  Тогда

        
        НовВз = Новый ЗапускПриложенияМобильногоУстройства();		
		НовВз.Действие="com.google.zxing.client.android.ENCODE";
		НовВз.ДополнительныеДанные.Добавить("ENCODE_DATA","123","String");
		НовВз.ДополнительныеДанные.Добавить("ENCODE_TYPE","Text","String");
		НовВз.ДополнительныеДанные.Добавить("ENCODE_FORMAT","UPC_A","String");
		НовВз.Запустить(Истина);
		
		//Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл 
		//Сообщить(Стр.Ключ+" - "+Стр.Значение); 
		//	КонецЦикла;
		
		
		    Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл

								Сообщить(Стр.Ключ+" - "+Стр.Значение);
                            
        КонецЦикла;
		  
					
	#КонецЕсли


	

	 
КонецФункции // внешнийQR()
Показать





(0)
42. WKBAPKA 215 25.02.19 12:46 Сейчас в теме
в последних проектах я использовал библиотеку Retrofit. В 1С HTTP сервис.
43. пользователь 27.02.19 22:32
Сообщение было скрыто модератором.
...
45. fimbulwinter 31.10.19 23:32 Сейчас в теме
Спасибо, полезная статья.
47. WKBAPKA 215 01.11.19 12:28 Сейчас в теме
(45) проще подключить Retrofit
46. fimbulwinter 31.10.19 23:44 Сейчас в теме
может кто нибудь выложить проект на гитхаб?
48. WKBAPKA 215 01.11.19 12:28 Сейчас в теме
50. WKBAPKA 215 01.11.19 12:48 Сейчас в теме
статья устаревшая. Лучше попробуйте Retrofit.
Проще отлаживать, проще подключать, можно работать с GSon

вот пример интерфейса:


public interface ApiService {
    @GET("{secondURL}/{id}/products")
    Call<List<RetrofitProduct>> getListProducts(@Path(value =  "secondURL", encoded = true) String secondURL, @Path("id") String id_client);

}


вот вызов

   response = mApiService.getReport(
                    App.getDefaultSecondURL(),
                        App.CONSTANT_ID_PARTNER,
                        "reports",
                            retrofitDataReport).execute();

            if (response.isSuccessful()) {
                updateInfoReportData(idReport, response.body());
            }else {
                String errorMessage = response.raw().toString() + "\n"
                        + response.errorBody().string();
                updateInfoReportData(idReport, response.raw().toString());
                MyLog.d(errorMessage);
                res.putString(KEY_EVENT_TEXT_ERROR, errorMessage);

            }
Показать
52. FEAS88 8 07.05.20 15:44 Сейчас в теме
(50)
в последних проектах я использовал библиотеку Retrofit. В 1С HTTP сервис.


Тоже пробую через Retrofit. Но как авторизоваться на http сервисе? Подскажите плиз
53. WKBAPKA 215 09.05.20 11:45 Сейчас в теме
(52) https://infostart.ru/public/1148840/

можно тут почитать
если лень, то примерно так

if (retrofit == null) {
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .readTimeout(300, TimeUnit.SECONDS)
                    .addInterceptor(new BasicAuthInterceptor(user, pwd))
                     .build();


где BasicAuthInterceptor выглядит так

class BasicAuthInterceptor implements Interceptor{
    private String credentials;

    public BasicAuthInterceptor(String user, String password) {
        credentials = Credentials.basic(user, password);
    }

    *Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Request authenticatedRequest = request.newBuilder()
                .addHeader("Authorization", credentials)
                .build();
        return chain.proceed(authenticatedRequest);
    }

}
Показать
54. WKBAPKA 215 09.05.20 11:46 Сейчас в теме
(53) я в статье расписал как, можете скачать пример, он полностью работоспособный
51. WKBAPKA 215 01.11.19 12:53 Сейчас в теме
пример приведен синхронного вызова, т.к. работает с помощью WorkManager
Оставьте свое сообщение