Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
01 июл 2024, 12:13

WebСервисы

Автор vany_siman, 24 мая 2020, 18:14

0 Пользователей и 1 гость просматривают эту тему.

vany_siman

Кто разбирается в веб сервисах 1с. Создаю обмен данными между мобильной и центральной базой на веб сервере Apache, раньше не было никаких ошибок, сейчас, когда стал делать диплом, наткнулся на одну ошибку и не вижу корня проблемы, помогите решить
{ОбщаяКоманда.Обмен.МодульКоманды(29)}: Ошибка при вызове метода контекста (ВыполнитьОбмен)
ДанныеОбмена = Прокси.ВыполнитьОбмен(КодМобильногоКомпьютера,СформироватьПакетОбмена(ЦентральныйУзелОбмена));
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса:  {http://localhost/ws1}:WebОбмен:ВыполнитьОбмен()
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка SOAP сервера:  Неизвестная ошибка. {WebСервис.WebОбмен.Модуль(32)}: Ошибка при вызове метода контекста (НачатьЧтение)
по причине:
{WebСервис.WebОбмен.Модуль(32)}: Ошибка при вызове метода контекста (НачатьЧтение)
по причине:

по причине:
Неизвестный получатель
Код ошибки: Client
Техническая информация:
<detail xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>


по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса:  {http://localhost/ws1}:WebОбмен:ВыполнитьОбмен()
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка SOAP сервера:  Неизвестная ошибка. {WebСервис.WebОбмен.Модуль(32)}: Ошибка при вызове метода контекста (НачатьЧтение)
по причине:
{WebСервис.WebОбмен.Модуль(32)}: Ошибка при вызове метода контекста (НачатьЧтение)
по причине:

по причине:
Неизвестный получатель
Код ошибки: Client
Техническая информация:
<detail xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>


Модуль Веб сервиса

Процедура ЗарегистрироватьИзмененияДанных(УзелОбмена) Экспорт
  СоставПланаОбмена = УзелОбмена.Метаданные().Состав;
  Для каждого ЭлементСоставаПланаОбмена Из СоставПланаОбмена Цикл 
  ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена,ЭлементСоставаПланаОбмена.Метаданные);  
  КонецЦикла;
КонецПроцедуры

Функция ВыполнитьОбмен(КодУстройства, ДанныеУстройства)
   УстановитьПривилегированныйРежим(Истина);
   //Инициализация (если нужно)
   УзелОбмена = ПланыОбмена.Мобильные.ЭтотУзел().ПолучитьОбъект();
   Если НЕ ЗначениеЗаполнено(УзелОбмена.Код) Тогда
   УзелОбмена.Код = "001";
   УзелОбмена.Наименование = "Центральный";
   УзелОбмена.Записать();
   КонецЕсли;
//Получение данных из моб.устройства
   УзелОбмена = ПланыОбмена.Мобильные.НайтиПоКоду(КодУстройства);
   Если УзелОбмена.Пустая() Тогда
   НовыйУзел = ПланыОбмена.Мобильные.СоздатьУзел();
   НовыйУзел.Код = КодУстройства;
   НовыйУзел.Наименование = КодУстройства;
   НовыйУзел.Записать();
   ЗарегистрироватьИзмененияДанных(НовыйУзел.Ссылка);
   УзелОбмена = НовыйУзел.Ссылка;
   КонецЕсли;
   УзелОбмена = ПланыОбмена.Мобильные.НайтиПоКоду(КодУстройства);
   ЧтениеXML = Новый ЧтениеXML;
   ЧтениеXML.УстановитьСтроку(ДанныеУстройства.Получить());
   ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
   ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
   ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
   НачатьТранзакцию();
   Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
   Данные = ПрочитатьXML(ЧтениеXML);
   Если НЕ Данные = Неопределено Тогда
   Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
   Данные.ОбменДанными.Загрузка = Истина;
   Данные.Записать();
   КОнецЕсли;
   КОнецЦикла;
   ЗафиксироватьТранзакцию();
   ЧтениеСообщения.ЗакончитьЧтение();
   ЧтениеXML.Закрыть();
   УзелОбмена = ПланыОбмена.Мобильные.НайтиПоКоду(КодУстройства);
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку("UTF-8");
   ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
   ЗаписьСообщения.НачатьЗапись(ЗаписьXML,УзелОбмена);
   ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance");
   ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8","http://v8.1c.ru/data");
   ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена,ЗаписьСообщения.НомерСообщения);
   Пока ВыборкаИзменений.Следующий() Цикл
   Данные = ВыборкаИзменений.Получить();
   ЗаписатьXML(ЗаписьXML,Данные);
   КонецЦикла;
   ЗаписьСообщения.ЗакончитьЗапись();
   Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(),Новый СжатиеДанных(9));
КонецФункции

Модуль Команды обмена

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды,ПараметрВыполненияКоманды)
ОбработкаКомандыСервер();
КонецПроцедуры
&НаСервере
Процедура ОбработкаКомандыСервер()
Адрес = "http://192.168.0.3/ServiceDeskDB/ws/ws1.1cws?wsdl";
Определения = Новый WSОпределения(Адрес);
URI = "http://localhost/ws1";
Прокси = Новый WSПрокси(Определения,URI,"WebОбмен","WebОбменSoap");
СисИфно = Новый СистемнаяИнформация;
КодМобильногоКомпьютера = Строка(СисИфно.ИдентификаторКлиента);
Узел = ПланыОбмена.Мобильные.ЭтотУзел();
Если НЕ ЗначениеЗаполнено(Узел.Код)
ИЛИ Узел.Код <> КодМобильногоКомпьютера Тогда
ОбъектУзла = Узел.ПолучитьОбъект();
ОбъектУзла.Код = КодМобильногоКомпьютера;
ОбъектУзла.Наименование = КодМобильногоКомпьютера;
ОбъектУзла.Записать();
КонецЕсли;
ЦентральныйУзелОбмена = ПланыОбмена.Мобильные.НайтиПоКоду("001");
Если ЦентральныйУзелОбмена.Пустая() Тогда
НовыйУзел = ПланыОбмена.Мобильные.СоздатьУзел();
НовыйУзел.Код = "001";
НовыйУзел.Наименование = "Центральный";
НовыйУзел.Записать();
ЦентральныйУзелОбмена = НовыйУзел.Ссылка;
КонецЕсли;
ДанныеОбмена = Прокси.ВыполнитьОбмен(КодМобильногоКомпьютера,СформироватьПакетОбмена(ЦентральныйУзелОбмена));

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить());
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
НачатьТранзакцию();
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
Данные = ПрочитатьXML(ЧтениеXML);
Если НЕ Данные = Неопределено Тогда
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦИкла;
ЗафиксироватьТранзакцию();
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
КонецПроцедуры
Функция СформироватьПакетОбмена(УзелОбмена) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML,УзелОбмена);
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8","http://v8.1c.ru/data");
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена,ЗаписьСообщения.НомерСообщения);
ПОка ВыборкаИзменений.Следующий() Цикл
Данные = ВыборкаИзменений.Получить();
ЗаписатьXML(ЗаписьXML,Данные);
КОнецЦикла;
ЗаписьСообщения.ЗакончитьЗапись();
Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(),Новый СжатиеДанных(9));
КонецФункции // СформироватПакетОбменаДанными()


Максим75

Может кому еще интересно, данная ошибка возникает из-за кодов базы отправителя и базы приемника. Надо перехватить xml файл в отладчике еще до обращения на сервис в базе приемнике и посмотреть что стоит FROM и TO. Ну и поиграться кодами баз в списке плана обмена. Потому как на стороне сервиса не может пакет читаться, если он сам себе отправлен.

Теги:
Рейтинг@Mail.ru

Поиск