Имя: Пароль:
1C
 
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 передать второй параметр, то объект приходит полностью инициализированный