Имя: Пароль:
1C
1С v8
Отличие ЗаполнитьЗначенияСвойств() от явного мапинга. Проблема с Веб-сервисом.
,
0 Strogg
 
30.03.22
13:40
Всем привет.
Пилю интеграцию со сторонней системой через soap. Обмен происходит плоскими таблицами. Для этого создал вебсервис и xdto пакет, который описывает мою таблицу значений. Сам сервис работает, вопросов нет, проверяю его через SoapUI все четко. На стороне приемника wsdl распарсен и все поля видны. Проблема в том, что если я заполняю свой XDTO через ЗаполнитьЗначенияСвойств(СтрокаXDTOПакета, СтрокаТЗ) - ЗНАЧЕНИЯ полей не передаются - остаются пустыми на стороне приемника. Если же делаю явный мапинг по типу СтрокаXDTOПакета.Поле1 = СтрокаТЗ.Поле1 и т.д. то в системе-приемнике все ок.
Перед заполнением пакета пробовал типизировать свою ТЗ - результата ноль.
Может кто подскажет, если кто сталкивался с подобным багом, или фичей?
Да, все строки пакета - обычные string... только примитивные типы... И в таблице значений, соответственно, тоже только строки.
1 acht
 
30.03.22
13:55
Показывай структуру и код
2 p-soft
 
30.03.22
14:01
(0) скажу банальность: не стоит усложнять то что усложнять не стоит. чем проще структура данных, тем быстрее идет ее обработка и тем проще понять где ошибка.
3 Strogg
 
30.03.22
14:10
вот структура из СоапУИ
https://ibb.co/XfPfyD8
а вот что видится в системе-приемнике:
https://ibb.co/FKrVsNn
....
код самый элементарный:

    ТаблицаЗначенийТип = ФабрикаXDTO.Тип("http://gapclientscrm.ru", "ValueTable");
    СтрокаТЗТип = ФабрикаXDTO.Тип("http://gapclientscrm.ru", "TableString");
    
    ВыхТаблица = ФабрикаXDTO.Создать(ТаблицаЗначенийТип);
    
    Для каждого стр из ТзДляВыгрузки Цикл
        СтрокаТЗ = ФабрикаXDTO.Создать(СтрокаТЗТип);
        ЗаполнитьЗначенияСвойств(СтрокаТЗ, стр);
        ВыхТаблица.Composition.Добавить(СтрокаТЗ);
    КонецЦикла;
        
    Возврат ВыхТаблица;

Вот здесь, ЗаполнитьЗначениясвойств не работает, а поименное присвоение - работает...
4 hhhh
 
30.03.22
14:20
(3) ну сделайте поименное. Оно ведь быстрее работает, чем ЗаполнитьЗначенияСвойств.
5 Strogg
 
30.03.22
14:23
(4) да понятно, что если не получится - то придется делать. Хотелось бы разобраться с багом.
6 Вафель
 
30.03.22
14:27
у меня в веб сервисе такая конструкция вполне работает
7 Вафель
 
30.03.22
14:28
типы может не совпадают
8 Strogg
 
30.03.22
14:30
(7) типы в пакете везде стринг, в ТЗ явно типы задавал.
(6) это CI DS, там возможно всё, как мне рассказал администратор... причем в soapUI все изумительно смотрится...
9 Сергиус
 
30.03.22
14:48
(8)В пакете может быть необычный стринг..
10 Вафель
 
30.03.22
14:48
вот пример

    ОбъектXDTO = Фабрика.Создать(КачествоТип);
    ЗаполнитьЗначенияСвойств(ОбъектXDTO, Выборка);
    ОбъектXDTO.ID = ИДОбъекта(Выборка.Ссылка);
11 PuhUfa
 
30.03.22
14:48
А в твоей ТЗ значения этих самых полей все же Строка или Ссылки? И чем, например поле City отличается от других? Она, судя по картинкам, передается и при использовании ЗаполнитьЗначенияСвойств.
12 Вафель
 
30.03.22
14:50
У тебя фабрика по схеме задается или встроенную используешь?
13 Strogg
 
30.03.22
14:52
(11) везде строки. Я же писал анее, что типизировал ТЗ перед заполнением свойств пакета из нее.
(9) (12) стринг обычный. из w3.org, или как там ее.... а вот тз моя.
14 Вафель
 
30.03.22
14:54
по отладчику сам объект(СтрокаТЗ) заполняется?
15 Strogg
 
30.03.22
14:56
(14) да. В первом скрине (https://ibb.co/XfPfyD8) все видно четко
16 acht
 
30.03.22
15:23
(15) wsdl или xsd показывай. У тебя на скриншоте нет ни ValueTable ни TableString а есть Composition.
17 serverstar
 
30.03.22
15:47
ну если SoapUI ничего не показывает...
18 timurhv
 
30.03.22
17:06
(0) Пишу руками, можно написать свою процедуру по заполнению, которая будет обходить все реквизиты 2-ого параметра и вставлять значения в 1-ый.

ЗаполнитьЗначенияСвойств - плохая конструкция: в xsd-схеме может у поля указано nillable="true" и висеть регулярка на проверку значения. Пустая строка по регулярке выпадет в ошибку.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан