|
XDTO: типы значений и отсутствующие поля | ☑ | ||
---|---|---|---|---|
0
hawksib
24.07.19
✎
16:45
|
Работаю около года с такой сущностью 1С как XDTO-фабрика.
Всё что знаю, нагуглил самостоятельно, никаких специальных обучающих материалов в своё время не попалось. Всё, что написал, сейчас исправно работает. Но в связи с поступлением новых предложений, думаю, настало время задуматься, как оптимизировать имеющиеся алгоритмы. Собственно, терзают меня 2 вопроса: 1. В любой xsd схеме должны быть описаны типы значений объектов. Как, не использую конструкцию XMLЗначение(<Тип>, <Значение>), сразу получать значение из объекта xdto нужного типа? То есть допустим у меня есть объект Stock, в котором есть числовое поле volume, которое при обращении к нему через точку (Stock.volume) дает значение типа строка, но в нём хранится число, поэтому для приведения я использую конструкцию XMLЗначение(Тип("Число"), Stock.volume) и получаю числовое значение. 2. Как без попытки понимать, что объект и его свойства не заполнены? Пример: в схеме описано, что в объекте Title содержатся объекты Part1, Part2 и Part3. Любой из объектов Part в xml файле может быть не заполнен. Допустим, я ожидаю значения в каждом, но не знаю, что какой-то не заполнен. Так как через точку могу обратиться только к имеющимся объектам, все обращения заворачиваю в попытку. итого, 2 вопроса: Как сразу получать значение из объекта xdto нужного типа? Как без попытки понимать, что объект и его свойства не заполнены? |
|||
1
palsergeich
24.07.19
✎
18:03
|
(0) По вопросу 2:
Объект XDTO - имеет Тип XDTO, вот как раз в типе и есть метод ТипОбъектаXDTO.Свойства (XDTOObjectType.Properties) Свойства (Properties) Использование: Только чтение. Описание: Тип: КоллекцияСвойствXDTO. Содержит коллекцию свойств объекта. |
|||
2
palsergeich
24.07.19
✎
18:06
|
По поводу 1 - на сколько я помню в случае простых типов - строка в число в момент записи XML переведется, но это не точно.
Но я не помню каких либо проблем с этим и XMLЗначение(<Тип>, <Значение>) этой штукой не пользовался, возможно я не прав. |
|||
3
palsergeich
24.07.19
✎
18:07
|
Или я не правильно понял вопрос 2?
|
|||
4
hawksib
25.07.19
✎
02:29
|
(2) да, в момент записи всё отлично переводится, вопрос в том, что в момент чтения всегда получаются строки, которые, если складывать, дают не от, что нужно
(3) вопрос 2 тоже связан исключительно с чтением объекта. Попробую привести ещё 1 пример: в объекте date могут содержаться поля year, month и day, когда читаю xml у меня возникает ошибка "Поле объекта не обнаружено (day)" потому что в файл были записаны только year и month (day просто не было указано). Я решил данный вопрос используя попытку при чтении значений полей. Вопрос в том, можно ли каким то образом объяснить 1С, что я ожидаю полный набор полей, даже если они не указаны, пусть в них хранится null или неопределено |
|||
5
hawksib
26.07.19
✎
02:31
|
судя по всему вопрос не изучен...
(1) спасибо, что ответил |
|||
6
Zhuravlik
26.07.19
✎
03:06
|
1. Простые типы прекрасно конвертятся при их указании в xsd.. даже составной тип можно сделать
2. Попытка - всегда зло.. Пользуйтесь проверкой через коллекцию свойств (1), либо просто объявляйте тип обязательным. Лучше на неопределенность проверять чем иметь портянку с "попытками". |
|||
7
hawksib
02.08.19
✎
18:41
|
(6)
1. научите указывать тип в xsd... схемы я тяну с ресурса, на который запросы отправляю, и вроде бы как простые типы должны быть объявлены |
|||
8
palsergeich
02.08.19
✎
19:28
|
как отказаться от попыток.
Самый правильный путь ИМХО как это реализовано в КД3 На входе имеешь XDTO Шаг1 : Потом из типа XDTO -> получаешь название всех полей -> Создаешь структуру со всеми полями из типа -> Делаешь ЗаполнитьЗначенияСвойств(Структура, ОбъектXDTO) Шаг 2 Анализируешь структуру, полученную на шаге 1) и из структуры делаешь манипуляции с БД, или произвольный код. Те поля, которых в XDTO нет, и они могут быть, а могут и не быть, будут иметь значение НЕОПРЕДЕЛЕНО |
|||
9
hawksib
08.08.19
✎
02:58
|
(8) а если в объекте лежат объекты, но во вложенных объектах нету полей, засовывать структуры в структуры предлагаете, при этом полностью перечитывая весь объект на входе?
|
|||
10
rphosts
08.08.19
✎
03:52
|
(9) именно в КД3 структуры в структуры сувать - это нормально!
|
|||
11
hawksib
10.08.19
✎
04:13
|
(10) дело не в нормальности, а в производительности, получается мне перед чтением самого объекта нужно его полностью инициализировать, ведь это более ресурсоемко, я ведь правильно понимаю?
|
|||
12
ДНН
10.08.19
✎
07:44
|
1. В XDTO пакете указать тип число. Читать XML через фабрику XDTO, указав URI пространства имен и имя объекта. На вскидку не помню, но примерно так:
Тип = ФабрикаXDTO.Тип("Пространство имен твоего пакета", "Имя объекта"); ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(XMLФайл, Тип ) В переменной ОбъектXDTO типы значений будут соответствовать типам из пакета XDTO |
|||
13
hawksib
12.08.19
✎
18:27
|
(12) да, только что сам дошёл до этого, совершенно верно, если в функцию прочитьXML передать второй параметр, то объект приходит полностью инициализированный
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |