Имя: Пароль:
1C
1C 7.7
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>&#x410;&#x43D;&#x442;&#x43E;&#x43D;</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>&#x410;&#x43D;&#x442;&#x43E;&#x43D;</recipient_title><method><id>2</id><title>&#x421;&#x430;&#x43C;&#x43E;&#x432;&#x44B;&#x432;&#x43E;&#x437;</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>&#x41E;&#x43F;&#x43B;&#x430;&#x442;&#x430; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x43D;&#x44B;&#x43C;&#x438; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x438;</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
42 Sevnet
 
25.05.14
13:45
(41) сори затупил, чёта думал, что это в 1С какой-то объект.
Я просто самоучка, и программирование не основная деятельность, а только сопутствующая.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший