Что не так с этим XML?
В результате подключения к веб-сервису SAP получаю следующий XML-файл, но 1с прочитатье его в фабрику ХDTO не может.
Файл получила в SOAPUL.
Ошибка 1с:
Ошибка при вызове метода контекста (ПрочитатьXML)
{ВнешняяОбработка.ПроверкаВэбСервисаОтветхранение.Форма.Форма.Форма(244)}: Данные = Прокси.ФабрикаXDTO.ПрочитатьXML(Чтение);
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Document is empty
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ФайлXML);
Прокси = ПолучитьДанныеОтветхранениеНаСервере();
Данные = Прокси.ФабрикаXDTO.ПрочитатьXML(Чтение);
Так вопрос о том, каким образом Вы этот файл получаете, не раскрыт. Правильные поцики получают как-то так:
W = Новый WSОпределение(УрлТочкиВхода, какие-то-параметры типа таймаута и пароля);
P = Новый WSПрокси(W, точкивхода и прочее);
P.Пароль = "ххх";
P.Логин = "ууу";
XDTOОбъект = P.GetЧтоТоТамБлаБлаБла(Параметры);
После этого в переменной XDTOОбъект будет находится тот самый XML в виде объекта (типа XDTOОбъект.MX1.XML_FILE.XML_FILE <- здесь строка с этим ХМЛом, ну или как-то так). Дальше делайте с ним што хочите.
ЗЫ: На стороне САП дятлы походу, ибо XML не в виде пакета/объекта передают, а в виде строки. Видимо все, кто что-то в этом понимает, и правда свалили - один я остался )))
Список XDTO - это список объектов. К нему можно или в цикле обратиться (для каждого Х из У), или по индексу (у[0]). Внутри нужные объекты. Просто в отладчике поглядите - все поймете откуда и что брать.
Да. Они посылают пакет, которые не соответствует описанию в WSDL-файле. Скорее всего они изменили пакет, прочитав про свой дебилизм, поэтому WSDL-файл надо обновить, ну или вызвать не так, как у Вас (из файла), а прямо с урла:
//Определение = Новый WSОпределения(имяФайла, блаблабла);
Определение = Новый WSОпределения(Урл, блаблабла);
Ну или если у Вас там нестандартный порт юзается, то нужно просто обновить WSDL-файл, поправив сцылки.
Ответный вопрос - зачем? Сам по себе формат определяется в стандартах SOAP или HTTP. Если у Вас сервис возвращает ошибку, то проблема скорее всего не в пакете, который посылает 1С, но 1С не посылает ничего из того, что бы не описал автор запроса.
Посмотреть, конечно, можно, и много как. Есть все эти сканеры трафика, например. Только это вряд ли поможет, т.к. проблема именно в содержании файла, а не в формате. И сервер в общем-то должен давать четкий ответ, что не так.
(2) Та же ошибка: Ошибка при вызове метода контекста (ПрочитатьXML)
{ВнешняяОбработка.ПроверкаВэбСервисаОтветхранение.Форма.Форма.Форма(245)}: Данные = ФабрикаXDTO.ПрочитатьXML(Чтение);
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Document is empty
Если писать
ФабрикаXDTO.ПрочитатьXML(Чтение);
то как 1с определит структуру в которую нужно XML прочитать?
(3) Да, в шапке файла ответ сервера, а ниже уже реквизиты документа нужные мне. В 1с-то я не смогла увидеть резутьтат ответа веб сервиса, этот файл получен в SOAPUL.
Даже если удалить шапку файла и оставить тело документа он тоже не читается. Ошибка та-же Document is empty.
(5)1С ничего не знает про пространства имен и используемые типы значений в них, содержащиеся в файле, поэтому и не может ничего прочитать самостоятельно.
Более того, символы "<" заменены на "& # 60 ;"(без пробелов), их нужно обратно превратить.
Расскажите мне про курсы, на которых учат чему-то про SOAP. В моей статье про приложуху для мобилы за полчаса больше написано, чем в среднем на курсах про это рассказывают.
И внезапно пациент начинает понимать про XML, про пространства имен, про термнологию, про точки подключения... видит и осознает как это реализовано на 1С, какие структуры, описывающие протокол, что означают.
Но это не наш путь. Наш путь - зайти со стороны прикладного решения и мучаться даже в терминологии, не понимая принципов и желая чтобы всё сразу.
|А если вспомнить до конца, то совет пойти на курсы ни к чему не привел, при том совет был с цитатой кода 1С. А вот мои ответы приводят к результату. Отсюда как бы вопрос Ваших компетенций. Вы тут с целью самоутвердиться за чужой счет буквы пишите? Печально, что не можете самоутвердиться за собственный счет. Может тоже на курсы Вас послать?
Ну вот оно и есть, типичное нежелание 1Сника выбраться за границы своего уютненького и понять, как именно устроены те технологии, которые он пытается использовать.
На себя поглядите, выбравщийся за границы и не имеющий возможности принести хоть какую-тор пользу. А про RPC я еще лет 20 писал назад, так что не ко мне вопросы. Тем более в винде это все сделано школьниками для школьников. При том сервис того же ЦБ 1С подтягивает через WSDL, в то время как для питона приходится юзать Doctor (если Вы вообще способны понять, о чем я тут).
Так вопрос о том, каким образом Вы этот файл получаете, не раскрыт. Правильные поцики получают как-то так:
W = Новый WSОпределение(УрлТочкиВхода, какие-то-параметры типа таймаута и пароля);
P = Новый WSПрокси(W, точкивхода и прочее);
P.Пароль = "ххх";
P.Логин = "ууу";
XDTOОбъект = P.GetЧтоТоТамБлаБлаБла(Параметры);
После этого в переменной XDTOОбъект будет находится тот самый XML в виде объекта (типа XDTOОбъект.MX1.XML_FILE.XML_FILE <- здесь строка с этим ХМЛом, ну или как-то так). Дальше делайте с ним што хочите.
ЗЫ: На стороне САП дятлы походу, ибо XML не в виде пакета/объекта передают, а в виде строки. Видимо все, кто что-то в этом понимает, и правда свалили - один я остался )))
Определение = Новый WSОпределения("C:/Users/savina.ikt/Documents/Severstal/ws2/BC_SYS_CLNT_si_DataLoad_outb_syncService_2.wsdl", Пользователь, Пароль,,,ssl1);
Прокси = Новый WSПрокси(Определение, "http://severstal.com/pi/O2C/1C", "si_DataLoad_outb_syncService", "HTTPS_Port",, , ssl1);
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://severstal.com/pi/O2C/1C").Получить("dt_DataLoad_MX1_req");
WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
WSПараметр.dummy = Формат(9002, "ЧГ=100");
РезультатВебОперации = Прокси.MX1(WSПараметр);
Показать
РезультатВебОперации содержит МХ1 - списокXDTO - если он не пустой, то тоже не читается - ошибка чтенияXML. Поэтому пытаюсь загрузить ту XML, что получаю в SOAPUL.
Список XDTO - это список объектов. К нему можно или в цикле обратиться (для каждого Х из У), или по индексу (у[0]). Внутри нужные объекты. Просто в отладчике поглядите - все поймете откуда и что брать.
Ошибка при вызове метода контекста (MX1)
{ВнешняяОбработка.ПроверкаВэбСервисаОтветхранение.Форма.Форма.Форма(149)}: РезультатВебОперации = Прокси.MX1(WSПараметр);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://severstal.com/pi/O2C/1C}:si_DataLoad_outb_syncService:MX1()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://severstal.com/pi/O2C/1C}dt_DataLoad_MX1_resp - [1,253]
Проверка дополнительного свойства:
форма: Элемент
имя: MX1
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://severstal.com/pi/O2C/1C}dt_DataLoad_MX1_resp - [1,253]
Проверка дополнительного свойства:
форма: Элемент
имя: MX1
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://severstal.com/pi/O2C/1C}dt_DataLoad_MX1_resp
Всетаки со стороны отправителя не читаемый XML отправляют? Не та кодировка если есть не читаемые символы?
Да. Они посылают пакет, которые не соответствует описанию в WSDL-файле. Скорее всего они изменили пакет, прочитав про свой дебилизм, поэтому WSDL-файл надо обновить, ну или вызвать не так, как у Вас (из файла), а прямо с урла:
//Определение = Новый WSОпределения(имяФайла, блаблабла);
Определение = Новый WSОпределения(Урл, блаблабла);
Ну или если у Вас там нестандартный порт юзается, то нужно просто обновить WSDL-файл, поправив сцылки.
Ответный вопрос - зачем? Сам по себе формат определяется в стандартах SOAP или HTTP. Если у Вас сервис возвращает ошибку, то проблема скорее всего не в пакете, который посылает 1С, но 1С не посылает ничего из того, что бы не описал автор запроса.
Посмотреть, конечно, можно, и много как. Есть все эти сканеры трафика, например. Только это вряд ли поможет, т.к. проблема именно в содержании файла, а не в формате. И сервер в общем-то должен давать четкий ответ, что не так.
(21) Простите за назойливость, может это и за гранью моего понимания, но....
В 1с сервис вроде бы работает, но несовсем. Если для передачи нет файлов, т.е. отправляют пустой ответ по запросу из 1с:
РезультатВебОперации = Прокси.MX1(WSПараметр);
То в результате веб операции - это ОбъектХДТО содержащий МХ1 - СписокХДТО но список пустой.
Если с сапа отправляют хмл документ, то в момен
РезультатВебОперации = Прокси.MX1(WSПараметр);
я получаю ошибку:
Ошибка при вызове метода контекста (MX1)
{ВнешняяОбработка.ПроверкаВэбСервисаОтветхранение.Форма.Форма.Форма(149)}: РезультатВебОперации = Прокси.MX1(WSПараметр);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://severstal.com/pi/O2C/1C}:si_DataLoad_outb_syncService:MX1()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://severstal.com/pi/O2C/1C}dt_DataLoad_MX1_resp - [1,253]
Проверка дополнительного свойства:
форма: Элемент
имя: MX1
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://severstal.com/pi/O2C/1C}dt_DataLoad_MX1_resp - [1,253]
Проверка дополнительного свойства:
форма: Элемент
имя: MX1
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://severstal.com/pi/O2C/1C}dt_DataLoad_MX1_resp
Но в SOAPUL этот хмл в какой то корявой кодировке (см. фото). Специалисты сап тут ничем помочь не могут и просят хмл запрос который отпарвляет 1с к сап.
Вот что отвечают специалисты сап:
Внутри ответа сервиса содержится тестовое поле содержащие xml. Я не знаю что это за xml и не знаю его структуру данных.
Кодировка тут не причём.
А ошибка у вас скорее всего из за того что вы пытаетесь сопоставить вложенный текст с wsdl сервиса, это никогда работать не будет.
Вам надо достать текст и парсить его отдельно предварительно преобразовав его в xml.
Предлагаю с начала добиться корректной работы, а потом поговорим по поводу кодировки. Давайте есть слона постепенно.
Я не понимаю их ответ. Что я должна с этим делать если в 1с получить корректный ответ веб сервиса не могу. И где искать ошибку? В каком направлении смотреть?