![]() |
|
v7: Обмен данными с интернет магазином API | ☑ | ||
---|---|---|---|---|
0
Sevnet
23.05.14
✎
19:45
|
Куплен движ OWOX, есть 1С 7.7.
Возникла следующая неразрешимая самостоятельно проблема. При получении ответа на HTTP запрос, в строке-ответе HTTP кириллица приходит в виде кодировки HTML-entetles - так её называет декодер студии Арт.Лебедева (http://www.artlebedev.ru/tools/decoder/) Например: "Антон" → "Антон", "HTML-Entities" → "UTF-8". Готовые примеров декодирования я нигде не нашел, да и не ясно, что это вообще за кодировка такая HTML-Entities??? Строка запроса, например информации о заказе, целиком выглядит так: <?xml version="1.0"?> <Orders><record_type>0</record_type><part><end>1</end><next_part>1</next_part></part><records><record><status>new</status><id>108</id><user><id>247</id><first_name>Антон</first_name><last_name></last_name><second_name></second_name><email></email><phones><record><title>380501311879</title></record></phones><addresses/></user><amount>10875</amount><currency_rate>8</currency_rate><comment></comment><created>2014-04-03 20:46:31</created><changed>2014-04-03 20:46:31</changed><merchandises><record><id>1</id><goods><id>68169</id></goods><quantity>1</quantity><cost>10874.75</cost></record></merchandises><deliveries><record><id>1</id><status>not-processed</status><recipient_title>Антон</recipient_title><method><id>2</id><title>Самовывоз</title></method><cost>0</cost><phone><title>380501311879</title><ext></ext><type>mobile</type><status>untested</status></phone><address/><comment></comment><created>2014-04-03 20:46:31</created></record></deliveries><invoices><record><payment_method><id>14</id><title>Оплата наличными при получении</title></payment_method><payment_currency/><amount>10874.75</amount><amount_currency>10874.75</amount_currency><comment></comment><status>unpaid</status></record></invoices></record></records></Orders> |
|||
1
Sevnet
23.05.14
✎
19:46
|
Помогите, плиз, разобраться что за кодировка и как её переводить в кириллицу???
Возможно можно каким-то образом разобрать файл в таблицу или ещё какой-нить более приемлемый вид, чтобы уже обращаться туда? |
|||
2
Miracle_
Miracle 23.05.14
✎
19:52
|
и что тут такого? Какой-то антон при получении товара самовывозом должен оплатить наличными 10874.75
|
|||
3
Sevnet
23.05.14
✎
19:55
|
Тут всё ок, имеется ввиду в 1С 7.7 перевести программным методом кодировку в текст?
А при отправке параметров, обратно текст в кодировку?? |
|||
4
Sevnet
23.05.14
✎
19:55
|
Как?
|
|||
5
Miracle_
Miracle 23.05.14
✎
20:15
|
http://webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm
Вот соответствия.Переводи,потом парсь. |
|||
6
Gepard
23.05.14
✎
20:17
|
(0) с помощью чего получаются данные с сайта?
|
|||
7
Miracle_
Miracle 23.05.14
✎
20:17
|
А вообще я твою муть открыл в IE и сохранил в тхт и все сохранилось с кирилицей.
|
|||
8
Sevnet
23.05.14
✎
20:25
|
Miracle_Miracle. за ссылку спс, я искал эту таблицу но находил только в 10тиричном виде, без указание на то что бывает и HEX.
Вот с IE я тоже долго долбался, т.к. встречал упоминания об этом методе, но та и не разобрался как в конфигураторе это сделать? Gepard С помощью запроса "open" объекта winhttp: objHTTP = СоздатьОбъект("winhttp.winhttprequest.5.1"); objHTTP.open("GET", "http://api.at5.ua/Orders/?id=108"); objHTTP.send(ТекстЗапроса); хотя этот же объект эквивалентен objHTTP = СоздатьОбъект("Msxml2.XMLHTTP.6.0"); Вообще я разницы в них не улавливаю... |
|||
9
Gepard
23.05.14
✎
20:28
|
objHTTP = СоздатьОбъект("winhttp.winhttprequest.5.1");
objHTTP.Option(2,"utf-8"); objHTTP.open("GET", "http://api.at5.ua/Orders/?id=108"" target="_blank" rel="nofollow" class="extralink">http://api.at5.ua/Orders/?id=108";); objHTTP.send(ТекстЗапроса); а если так? |
|||
10
Gepard
23.05.14
✎
20:33
|
еще некоторые рекомендуют ServerXmlHttpRequest
|
|||
11
Sevnet
23.05.14
✎
20:35
|
Gepard, попробовал не фига. У меня в заголовках указана кодировка
objHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8"); |
|||
12
Sevnet
23.05.14
✎
20:37
|
ServerXmlHttpRequest, а что это если вкратце? И как им пользоваться, а то я загуглил всё в основном на аглоязычных сайтах?
|
|||
13
Gepard
23.05.14
✎
20:38
|
(11) кстати, можно попробовать там же добавить SetRequestHeader("Accept-Charset","windows-1251");
|
|||
14
Gepard
23.05.14
✎
20:38
|
(13)вполне может получиться заставить сервер возвращать данные в виндовой кодировке)
|
|||
15
Sevnet
23.05.14
✎
20:42
|
та не, я пробовал выставлять
objHTTP.setRequestHeader("Content-Type", "text/xml;charset=windows-1251"); один фиг, тоже самое возвращает, там и в документации к движку OWOX сказано, что возвращает utf-8 |
|||
16
Эмбеддер
23.05.14
✎
20:43
|
после "&#" идет юникокод символа, перевести в строку можно через вызов функции Символ(), даже таблиц не надо создавать
|
|||
17
Gepard
23.05.14
✎
20:47
|
http://infostart.ru/public/18816/ можно так попробовать
|
|||
18
Sevnet
23.05.14
✎
20:49
|
Gepard
да раскодировать я смогу, ща где-нить нарою готовый код, только символы кода подменю и засуну в глобальный модуль... Мне бы какой нить метод разбора полей, чтобы не по тупому поиском нужных текстовых частей и отрезания всего вокруг по названию тегов, методом НужноеЗначение = Прав(СтрокаВозврата, Найти(СтрокаВозврата, "<какой-нить тэг>") - ДлинаСтроки("<какой-нить тэг>")); НужноеЗначение = Лев(НужноеЗначение, Найти(НужноеЗначение, "</какой-нить тэг>")); а то это как-то глаза режет... |
|||
19
Sevnet
23.05.14
✎
20:54
|
Эмбеддер, а юникод разве на 10чином формате??? А у меня HEX, если так, то сначала надо преобразовывать в 10чный, а потом через Символ()
Gepard, за ссылку спс, я по-моему напарывался на неё, но тут проблема в том что разбор 10чных кодов, а мне сервак возвращает HEX, поэтому он мне не подошел. |
|||
20
Miracle_
Miracle 23.05.14
✎
21:07
|
http://kb.mista.ru/article.php?id=73
вот пример чтения xml И тебе все равно нужно знать содержимое каких тегов тебя интересует. |
|||
21
Sevnet
23.05.14
✎
21:10
|
Эмбеддер, попробовал через функцию Симв()
Сообщить(Симв(410)); Сообщить(Симв(444)); А = "А"; н = "н"; Сообщить(КодСимв(А)); Сообщить(КодСимв(н)); вот что получил: ? ? 192 237 |
|||
22
Эмбеддер
23.05.14
✎
21:15
|
(21) забыл что 7-ка в условии, в 8-ке так срабатывает правильно Сообщить(Символ(4*256+1*16+0));
|
|||
23
Sevnet
23.05.14
✎
21:26
|
Ладно, таблица соответствий символов у меня есть, заварил чай, пойду разбирать своим уродским методом:
НужноеЗначение = Прав(СтрокаВозврата, Найти(СтрокаВозврата, "<какой-нить тэг>") - ДлинаСтроки("<какой-нить тэг>")); НужноеЗначение = Лев(НужноеЗначение, Найти(НужноеЗначение, "</какой-нить тэг>")); текст ответа и потом его так же резать до нужных 3х HEX знаков, а их по таблице соответствия HTML символов какой-нить процедуркой провращать в желаемый вид. Чую получится уродский код, ну да я на суперпрограммера и не претендую. Чё получится выкладу сюда. |
|||
24
Эмбеддер
23.05.14
✎
21:35
|
(23) я правильно понял, ты саму структуру xml хочешь разобрать кодом на 1С? лучше взять готовое. в 8-ке я использовал (и в 7-ке тоже можно)
MSXML2.xmlHttp для отправки и получения, Msxml2.DOMDocument для разбора а уже саму строку в этой кодировке можно разбирать в коде 1С |
|||
25
Sevnet
23.05.14
✎
21:43
|
Эмбеддер, О!, а что за Msxml2.DOMDocument и где есть по нему мануал можешь скинуть?
Но есть одно, НО, я получаю данные в ответе в виде сплошной строки... strReturn = objHTTP.responseText; У меня получится её разобрать этим объектом? |
|||
26
Sevnet
23.05.14
✎
21:50
|
точнее даже лучше примеры кода с разбором xml
|
|||
27
Эмбеддер
23.05.14
✎
21:56
|
куски кода могу привести
если ИспользоватьHTTPS тогда xmlHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); xmlHttp.Open("POST", urlAddress, 0); xmlHttp.SetCredentials(httpИмя, httpПароль, 0); xmlHttp.setRequestHeader ("User-Agent", "1C+Enterprise/8.2"); xmlHttp.setRequestHeader ("Host", hostName); xmlHttp.setRequestHeader ("Content-type", "Content-Type: text/xml; charset=utf-8"); иначе xmlHttp = New COMОбъект("MSXML2.xmlHttp"); xmlHttp.OPEN ("POST", urlAddress, 0, httpИмя, httpПароль); // False- отвечает за то, что запрос асинхронный и ожидаем ответа xmlHttp.setRequestHeader ("User-Agent", "1C+Enterprise/8.2"); xmlHttp.setRequestHeader ("Host", hostName); xmlHttp.setRequestHeader ("SOAPAction", ""); xmlHttp.setRequestHeader ("Content-type", "Content-Type: text/xml; charset=utf-8"); конецесли; DOC = Новый COMОбъект("Msxml2.DOMDocument"); если ФлажокВыводитьКомментарииВЛог тогда ИнформационноеСообщение("Запрашиваем ts="+Формат(ts, "ЧН=; ЧГ=0")); конецесли; DOC.loadXML("<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ws=""http://ws.stravel.ru/""> <soapenv:Header/> <soapenv:Body> <ws:GetUpdates> <since>"+Формат(ts, "ЧН=; ЧГ=0")+"</since> </ws:GetUpdates> </soapenv:Body> </soapenv:Envelope>"); попытка xmlHttp.SEND(DOC); исключение СообщитьОбОшибке("Ошибка при отправке "+ОписаниеОшибки()); возврат Неопределено; конецпопытки; |
|||
28
Эмбеддер
23.05.14
✎
21:59
|
если распарсивать средствами 8-ки, то таким образом
если xmlHttp.statusText="OK" тогда чтениеХМЛ = Новый ЧтениеXML; чтениеХМЛ.УстановитьСтроку(СокрЛП(xmlHttp.responseText)); хдто = Фабрика.ПрочитатьXML(чтениеХМЛ); возврат хдто; конецесли; если средствами 7-ки то только так DOC = Новый COMОбъект("Msxml2.DOMDocument"); DOC.loadXML("......."); |
|||
29
Эмбеддер
23.05.14
✎
22:00
|
с обработкой ошибок
DOCToSave = New COMОбъект("MSXML2.DOMDocument"); DOCToSave.loadXML(xmlHttp.responseText); If DOCToSave.parseError.errorCode <> 0 Then Сообщить("Ошибка разбора XML результата: " + DOC.parseError.reason); Возврат; EndIf; DOCToSave.save("c:\GetData.xml"); |
|||
30
Эмбеддер
23.05.14
✎
22:05
|
и еще в 8-ке имея XDTO (как (28) в 1-м варианте), можно получить иерархическую структуру данных (мне так было удобнее работать), функция тебе не пригодится но разбор полученных данных можешь сделать подобным образом
Функция ПреобразоватьОбъектXDTOвСтруктуру(ОбъектXDTO) экспорт Перем ВозвращаемоеЗнач; Если ОбъектXDTO = Неопределено Тогда ВозвращаемоеЗнач = Неопределено; ИначеЕсли ТипЗнч(ОбъектXDTO) = Тип("ЗначениеXDTO") Тогда ВозвращаемоеЗнач = ОбъектXDTO.Значение; ИначеЕсли ТипЗнч(ОбъектXDTO) = Тип("ОбъектXDTO") Тогда ВозвращаемоеЗнач = Новый Структура; Для каждого СвойствоXDTO Из ОбъектXDTO.Свойства() Цикл ВозвращаемоеЗнач.Вставить(СвойствоXDTO.Имя); Попытка // свойство - списокXDTO СписокXDTO = ОбъектXDTO.ПолучитьСписок(СвойствоXDTO); КоличествоСписка = СписокXDTO.Количество(); МассивЗначений = Новый Массив; Для Сч = 0 По КоличествоСписка - 1 Цикл МассивЗначений.Добавить(ПреобразоватьОбъектXDTOвСтруктуру(СписокXDTO.ПолучитьXDTO(Сч))); КонецЦикла; ВозвращаемоеЗнач[СвойствоXDTO.Имя] = МассивЗначений; Исключение // свойство - объектXDTO/значениеXDTO ВозвращаемоеЗнач[СвойствоXDTO.Имя] = ПреобразоватьОбъектXDTOвСтруктуру(ОбъектXDTO.ПолучитьXDTO(СвойствоXDTO)); КонецПопытки; КонецЦикла; КонецЕсли; Возврат ВозвращаемоеЗнач; КонецФункции |
|||
31
Sevnet
23.05.14
✎
22:50
|
Эмбеддер, xml документ получился без проблем, спс, но вот в 8ке я вообще ничего не знаю, дуплю уже полчаса на последний пост, не могу понять что этот код делает делает.
Как я понял ОбъектXDTO - это тот самый файл xml? В виде ссылки на файл или текста? Новый - это аналог СоздатьОбъект()? В 7ке есть такие типы значений: Тип("ЗначениеXDTO"), Тип("ОбъектXDTO") ? Что аналог а 7ке этому: Новый Массив; - таблица? Новый Структура; - ??? |
|||
32
Sevnet
23.05.14
✎
23:04
|
Да, и ещё забыл спросить, а что на выходе то после распарсивания xml фала? Таблица? Или какая структура то вообще?
|
|||
33
Эмбеддер
24.05.14
✎
06:45
|
про ОбъектXDTO я зря написал, это в 8-ке, только запутал
andrewks для 7-ки выкладывал пример здесь http://forum330.com/forum/78/all вот такой код полностью распарсивает строку, в том числе и те твои символы нормально понимает))) Функция ВывестиЭлем(ТекЭлем,Знач Смещ); Рез=1; Попытка Если (ТекЭлем.nodeType=1) Тогда Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":","!"); ИначеЕсли (ТекЭлем.nodeType=3) Тогда Сообщить(Смещ+"Текст элемента: "+ТекЭлем.nodeValue); ИначеЕсли (ТекЭлем.nodeType=4) Тогда Сообщить(Смещ+"CDATA: "+ТекЭлем.nodeValue); ИначеЕсли (ТекЭлем.nodeType=8) Тогда Сообщить(Смещ+"Комментарий: "+ТекЭлем.nodeValue,"I"); Иначе Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":"); Сообщить(Смещ+"Тип: "+ТекЭлем.nodeType); КонецЕсли; Для ном=0 По ТекЭлем.attributes.length-1 Цикл ТекАтр=ТекЭлем.attributes(ном); Сообщить(Смещ+"Атрибут: "+ТекАтр.nodeName+", значение: "+ТекАтр.nodeValue); КонецЦикла; Исключение Рез=0; КонецПопытки; Смещ=Смещ+" "; Для ном=0 По ТекЭлем.childNodes.length-1 Цикл ДочЭлем=ТекЭлем.childNodes(ном); Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ); КонецЦикла; Возврат Рез; КонецФункции Процедура Сформировать() DOC = СоздатьОбъект("Msxml2.DOMDocument"); //DOC.loadXML(".......") DOC.load("c:\temp\1.xml"); Рут=DOC.documentElement(); Смещ=""; Рез=ВывестиЭлем(Рут,Смещ); КонецПроцедуры и в результате работы получается Элемент Orders: Элемент record_type: Текст элемента: 0 Элемент part: Элемент end: Текст элемента: 1 Элемент next_part: Текст элемента: 1 Элемент records: Элемент record: Элемент status: Текст элемента: new Элемент id: Текст элемента: 108 Элемент user: Элемент id: Текст элемента: 247 Элемент first_name: Текст элемента: Антон Элемент last_name: Элемент second_name: Элемент email: Элемент phones: Элемент record: Элемент title: Текст элемента: 380501311879 Элемент addresses: Элемент amount: Текст элемента: 10875 Элемент currency_rate: Текст элемента: 8 Элемент comment: Элемент created: Текст элемента: 2014-04-03 20:46:31 Элемент changed: Текст элемента: 2014-04-03 20:46:31 Элемент merchandises: Элемент record: Элемент id: Текст элемента: 1 Элемент goods: Элемент id: Текст элемента: 68169 Элемент quantity: Текст элемента: 1 Элемент cost: Текст элемента: 10874.75 Элемент deliveries: Элемент record: Элемент id: Текст элемента: 1 Элемент status: Текст элемента: not-processed Элемент recipient_title: Текст элемента: Антон Элемент method: Элемент id: Текст элемента: 2 Элемент title: Текст элемента: Самовывоз Элемент cost: Текст элемента: 0 Элемент phone: Элемент title: Текст элемента: 380501311879 Элемент ext: Элемент type: Текст элемента: mobile Элемент status: Текст элемента: untested Элемент address: Элемент comment: Элемент created: Текст элемента: 2014-04-03 20:46:31 Элемент invoices: Элемент record: Элемент payment_method: Элемент id: Текст элемента: 14 Элемент title: Текст элемента: Оплата наличными при получении Элемент payment_currency: Элемент amount: Текст элемента: 10874.75 Элемент amount_currency: Текст элемента: 10874.75 Элемент comment: Элемент status: Текст элемента: unpaid |
|||
34
Sevnet
25.05.14
✎
01:49
|
(33) Эмбеддер, спасибище огромное, всё работает, и кириллица нормально выводится!
Но у меня возникло несколько вопросов, т.к. я встретил несколько методов впервые, и сам никогда ими не пользовался: 1. Что за оператор "Знач" Crtl+F1 его не знает, где почитать? Функция ВывестиЭлем(ТекЭлем, Знач Смещ); 2. Где взять файл синтаксис помощника для объекта Msxml2.DOMDocument?? Типо фалик *.als 3. Не знал, что можно вызывать функцию саму в себе), и в упор не могу раздуплится, каким образом эта строчка Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ); выводит сообщения в табло? Если можно поясните, плиз, или пошлите куда-нить почитать? |
|||
35
Злопчинский
25.05.14
✎
02:18
|
(34) ЗНАЧ - параметр передается не по ссылке, а по значению.
То есть фактически параметр, передаваемый в процедуру - останется без изменения, в процедуре будет сделана копия, которая даже если изменится - не поменяется исходный параметр |
|||
36
Злопчинский
25.05.14
✎
02:20
|
Вывод сообщенйи в табло:
ВывестиЭлем(...) - очевидно, что внутри этой функции (или внутри других функций/процедур, вызываемых из этой) используется оператор Сообщить("чтото в табло") |
|||
37
Sevnet
25.05.14
✎
02:32
|
(36) да тут тупанул...
Мануальчик бы по методам Msxml2.DOMDocument |
|||
38
Злопчинский
25.05.14
✎
02:32
|
> Не знал... вызывать функцию саму в себе...
Просвещайся: http://ru.wikipedia.org/wiki/Рекурсия |
|||
39
Эмбеддер
25.05.14
✎
06:46
|
(34) "2. Где взять файл синтаксис помощника для объекта Msxml2.DOMDocument?? Типо фалик *.als"
к 1С это отношения не имеет, поэтому *.als файла не будет. это объект фирмы майкрософт. у меня доки нет, гугль рулит |
|||
40
ДенисЧ
25.05.14
✎
07:45
|
(34) хочется просто взять и послать....
|
|||
41
ДенисЧ
25.05.14
✎
07:46
|
(37) http://msdn.microsoft.com/en-us/library/aa923288.aspx
10 секунд гугля |
|||
42
Sevnet
25.05.14
✎
13:45
|
(41) сори затупил, чёта думал, что это в 1С какой-то объект.
Я просто самоучка, и программирование не основная деятельность, а только сопутствующая. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |