Имя: Пароль:
1C
1С v8
Web service (веб сервис) тип возвращаемого значения
,
0 Svirepy
 
19.10.11
15:21
Народ, хэлп! Не могу разобраться: поднят веб сервис, его функция делает вот это:
Функция Products(ProdName,Article) Экспорт
   
   Запись = Новый ЗаписьXML;
   Запись.УстановитьСтроку();
   Стр="";
   Если СтрДлина(Article) > 0 Тогда
       Отбор= Новый Структура("Артикул");
       Отбор.Артикул = Article;
       Выборка=Справочники.Номенклатура.Выбрать(,,Отбор,);
   ИначеЕсли СтрДлина(ProdName) > 0 Тогда
       Отбор= Новый Структура("Наименование");
       Отбор.Наименование = ProdName;
       Выборка=Справочники.Номенклатура.Выбрать(,,Отбор,);
   Иначе
       Выборка=Справочники.Номенклатура.Выбрать();    
   КонецЕсли;
   Запись.ЗаписатьНачалоЭлемента("Product");
   Пока Выборка.Следующий() Цикл
       Запись.ЗаписатьНачалоЭлемента("Article");
           Запись.ЗаписатьТекст(""+Выборка.Артикул);
       Запись.ЗаписатьКонецЭлемента();
       Запись.ЗаписатьНачалоЭлемента("ProdName");
           Запись.ЗаписатьТекст(""+Выборка.Наименование);
       Запись.ЗаписатьКонецЭлемента();
   КонецЦикла;
   Запись.ЗаписатьКонецЭлемента();

   //Запись = Запись.Закрыть();
   Возврат Запись;
КонецФункции
Как видите, пытаюсь вернуть запись XML, но всё портит тип возвращаемого значения функции - строка. Какой тип возвращаемого значения соответствует XML?
1 Serginio1
 
19.10.11
15:37
Да уж. Вообще то есть такое поняти XDTO пакеты,Типы Объектов, ФабрикаXDTO. Копай в этом направлении
2 Svirepy
 
19.10.11
15:40
Неужто придется создавать свой пакет только для того, чтобы передать кусок XMLя не в виде текста? УЖАС!!
3 Serginio1
 
19.10.11
15:48
А ты как думал. Но для C# например это будет сгенерен класс, с котрорым удобно работать.
Для этого и существует XML схемы (.xsd). Так же и из 1С Прокси.ФабрикаXDTO использует это описание. Многие кстати предпочитают передавать XML через строку, но это та неудобно пользователям
4 Svirepy
 
19.10.11
15:55
В принципе, он и в строке ничего так, тока выглядит примерно вот так:
<Article>3546516</Article>
:) вот гадство...
А ничего по-хитрому не удастся сделать? Без создания XDTO пакетов, попроще-то?
У меня с пакетами непонятки на принимающей стороне - пространство имен не видно, что ли... Не умею я с пакетами общаться, одним словом.
5 DmitrO
 
19.10.11
16:02
Возврат Запись.Закрыть();
ну а так-то чем не понравилось? будет именно то, что ты хочешь.
6 Svirepy
 
19.10.11
16:06
Именно потому, что угловые скобки преобразуются в кракозябры...
7 Svirepy
 
19.10.11
16:12
Может это быть проблемой PHP? Вряд ли, наверное, потому что весь остальной результат запроса приходит в прекрасно отображаемых угловых скобках...
8 DmitrO
 
19.10.11
16:49
По идее, клиент веб-сервиса должен сделать обратное преобразование.
Символы < > и т.п. в составе строки, через XML в чистом виде передать ведь невозможно, т.к. для формата XML это служебные символы. Также как и для html например.
9 Svirepy
 
19.10.11
17:00
У меня текстовая строка выглядит вот так:
<Product>
 <Article/>
<ProdName> Cu (2.5..50) 1комплект-3шт OZXT1 д ляOT45...125</ProdName>
 <Article>TRV00850</Article>
   <ProdName>1 КАБЕЛЬ RJ45/RJ45 (ВИЛ. ЧАСТЬ) L = 5 М</ProdName>
  <Article>TRV00803</Article>
   <ProdName>10 КАБЕЛЕЙ RJ45/RJ45 (ВИЛ. ЧАСТЬ) L=0.3М</ProdName>
 <Article>TRV00806</Article>
   <ProdName>10 КАБЕЛЕЙ RJ45/RJ45 (ВИЛ. ЧАСТЬ) L=0.6М</ProdName>
</Product>
Тип возвращаемого значения функции - строка. Даже если я передаю не вот эту строку, а сам объект ЗаписьXML, результат в обоих случаях выглядит вот так:
&lt;Product&dt;
 &lt;Article/&dt;
&lt;ProdName&dt; Cu (2.5..50) 1комплект-3шт OZXT1 д ляOT45...125&lt;/ProdName&dt;
 &lt;Article&dt;TRV00850&lt;/Article&dt;
   &lt;ProdName&dt;1 КАБЕЛЬ RJ45/RJ45 (ВИЛ. ЧАСТЬ) L = 5 М&lt;/ProdName&dt;
  &lt;Article&dt;TRV00803&lt;/Article&dt;
   &lt;ProdName&dt;10 КАБЕЛЕЙ RJ45/RJ45 (ВИЛ. ЧАСТЬ) L=0.3М&lt;/ProdName&dt;
 &lt;Article&dt;TRV00806&lt;/Article&dt;
   &lt;ProdName&dt;10 КАБЕЛЕЙ RJ45/RJ45 (ВИЛ. ЧАСТЬ) L=0.6М&lt;/ProdName&dt;
&lt;/Product&dt;

Даже если я просто собираю строку из текстовых блоков, окракозябривается текст обязательно. Можно ли обойтись БЕЗ создания пакета XDTO? Меня просто вымораживает эта ситуация...
10 Serginio1
 
19.10.11
17:03
Результат где? Какой результат возвращает при обращение в Вэб сервису из 1С?
11 Serginio1
 
19.10.11
17:04
Всегда тест нужно начинать из 1С, можно выловить большую часть ошибок в удобочитаемом виде.
12 Scooter
 
19.10.11
17:04
(3)мне тож интересна тема
а можешь плиз привести пример
13 Serginio1
 
19.10.11
17:09
(12) Через Пакеты XDTO ты описываешь свои данные. Данные могут быть как структурой так и массивом или списком структур или примитивных типов.
Для того что бы создать массив нужно указать минимальное количество 0, максимальное количество размер массива, для списка это -1. Ну и выдумать свое пространство имен. Все достаточно просто.
14 Svirepy
 
19.10.11
17:10
Результат с кракозябрами возвращается из 1С в обработчик PHP. В самой 1С (во внешнем отчете) все со скобками, как и должно быть.
15 Serginio1
 
19.10.11
17:14
Значит PHP не обрабатывает экранирующие символы.
16 Asmody
 
19.10.11
17:17
(9) правильно всё оно передаёт. только надо вспомнить, что у SOAP внутре XML, и твою строку с XML он приводит с безопасному виду. А в php есть вот такое http://ru.php.net/manual/en/function.html-entity-decode.php должно помочь
17 Serginio1
 
19.10.11
17:20
18 Scooter
 
19.10.11
17:21
(13)а ну всё понял
(14)смотри(13)
19 Svirepy
 
19.10.11
17:22
Спасибо, буду разбираться.
20 Serginio1
 
19.10.11
17:35
21 Serginio1
 
19.10.11
17:42
22 Scooter
 
19.10.11
17:45
(20)(21)спс