|
Сериализация XDTO | ☑ | ||
---|---|---|---|---|
0
mrpink
08.07.15
✎
05:49
|
Добрый день! Имеется файл xml с данными об изделии из pdm системы, файл достаточно объемный, в нем множество различной мнформации, всё это дело нужно правильно разобрать и создать в УПП в разных справочниках(спецификации, текарты, техоперации, номенклатура). Вданный момент я довольно коряво читаю этот файл через объектxdto, это позволяет мне хотя-бы не парсить файл, а обращаться к свойствам через точку. Но вот я думаю, а нельзя-ли ещё больше упростить с помощью сериализации? Вот есть у меня простая структура - ОбъектХДТО c тремя свойствами и спискомХДТО, а можно-ли создать в конфигурации подобный объект, (может быть справочник с тремя реквизитами и табчастью, может быть просто структуру) и сериализовать данные из файла прямо в этот объект? Насколько я понимаю сложность в именах и количестве реквизитов? Как считаете взлетит? Поделитесь опытом пожалуйста
|
|||
1
mrpink
08.07.15
✎
07:53
|
Ну ни у кого ни каких мыслей
|
|||
2
Лефмихалыч
08.07.15
✎
08:37
|
Это все равно, что голову под фуражку подгонять.
У тебя есть система А и система Б, из А в Б идет сообщение, Б это сообщение читает и какие-то внутри себя выводы делает. Зачем для этого в Б дублировать архитектуру А? |
|||
3
vicof
08.07.15
✎
08:38
|
А xsd схемы нет?
|
|||
4
Лефмихалыч
08.07.15
✎
08:38
|
можно поставить между ними третью систему, которая будет сторожить очередь сообщений, гарантировать доставку и осуществлять трансляцию объектов А в объекты Б. Такая система называется сервисная шина предприятия (ESB), но даже в ней для этого архитектуру ни под А, ни под Б нет смысла подгонять
|
|||
5
Лефмихалыч
08.07.15
✎
08:39
|
(3) у него уже вроде есть пакет-XDTO, так что схема ни чего нового не даст
|
|||
6
Лефмихалыч
08.07.15
✎
08:41
|
ESB, к слову сказать, как раз можен на основании сообщений А выдавать xlm-ки, содержащие сериализацию родных объектов Б. Это повысит независимость двух систем и надежность всей архитектуры предприятия. Но это надо работу работать в ощутимых объемах даже, если использовать какую-нить опенсорсную готовую ESB
|
|||
7
Матадор
08.07.15
✎
08:45
|
Можно написать набор XSL файлов, которе будут трансформировать исходный xml прямо в сериализованные объекты твоей конфигурации, останетсятолько пара строк кода, чтобы их записать.
Но следить за актуальностью преобразований нужно будет самостоятельно. если вдруг что-то в метаданнх поменяется. |
|||
8
mrpink
08.07.15
✎
10:15
|
(2) Ну правильно, но меня же интересует общий случай - дальше, если возможна такая сериализация, я думал двинуть в сторону как из элемента xml с помощью сериализации создавать типы данных нужные мне...ну тоесть упрощенно - в УПП техопреация имеет 10 реквизитов, в файле 15, вот думал с помощь схем как-то настроить, чтобы из элемента xml формировалася мой тип, хотя уже чувствую что больно многого захотел))
|
|||
9
mrpink
08.07.15
✎
10:22
|
(3) xdto пакеты я импортировал из схем
|
|||
10
mrpink
08.07.15
✎
10:24
|
(7) вот-вот вот об этом я и думал, только я хотел без xsl
|
|||
11
Матадор
08.07.15
✎
12:13
|
(10) Зачем без xsl? Его именно для этого придумали и используют.
|
|||
12
sapphire
08.07.15
✎
12:28
|
(0) Xpath проще нежели XDTO
|
|||
13
Матадор
08.07.15
✎
12:45
|
(12) Xpath проще, XSLT мощнее - разные инструменты, для разных случаев.
|
|||
14
Лефмихалыч
08.07.15
✎
12:46
|
(8) общий случай - это ESB. А там, чем ты будешь это делать, абсолютно наплевать.
|
|||
15
mrpink
08.07.15
✎
13:15
|
Подскажите, ЧЯДНТ, вот есть код
ТипНабор = ФабрикаXDTO.Тип("http://www.sample-package.org", "Набор"); ТипЗапись = ФабрикаXDTO.Тип("http://www.sample-package.org", "Запись"); НовыйНабор = ФабрикаXDTO.Создать(ТипНабор); Для Каждого стр из Part Цикл НоваяЗапись = ФабрикаXDTO.Создать(ТипЗапись); ЗаполнитьЗначенияСвойств(НоваяЗапись, стр); НовыйНабор.Записи.Добавить(НоваяЗапись); КонецЦикла; |
|||
16
mrpink
08.07.15
✎
13:16
|
а теперь я хочу без ЗаолнитьЗначенияСвойств создать ОбъектXDTO на основе строки, пробую
НоваяЗапись = ФабрикаXDTO.Создать(ТипЗапись, стр); |
|||
17
mrpink
08.07.15
✎
13:16
|
вылетает ошибка
|
|||
18
mrpink
08.07.15
✎
13:24
|
я хочу:
Вариант синтаксиса: Создание значения из значения Синтаксис: Создать(<Тип>, <Значение>) Параметры: <Тип> (обязательный) Тип: ТипЗначенияXDTO. Тип, значение которого необходимо создать. <Значение> (обязательный) Тип: Произвольный. Произвольное значение, на основе которого должно быть создано значение XDTO. Описание варианта метода: Создает значение XDTO по произвольному значению. |
|||
19
Лефмихалыч
08.07.15
✎
13:26
|
(17) текст ошибки надо угадать?
|
|||
20
mrpink
08.07.15
✎
13:26
|
получаю:
{Обработка.XDTO.Форма.Форма.Форма(123)}: Ошибка при вызове метода контекста (Создать) НоваяЗапись = ФабрикаXDTO.Создать(ТипЗапись, стр); по причине: Несоответствие типов (параметр номер '2') |
|||
21
mrpink
08.07.15
✎
13:27
|
(19) нет))
|
|||
22
Лефмихалыч
08.07.15
✎
13:28
|
(18) "стр" - это что за значение?
|
|||
23
mrpink
08.07.15
✎
13:29
|
строка из табличной части
|
|||
24
mrpink
08.07.15
✎
13:32
|
я предполагаю что такое сработает если ТипЗапись будет ЗначениеXDTO а у меня ОбъектXDTO
|
|||
25
Лефмихалыч
08.07.15
✎
13:34
|
(23) откуда у тебя информация, что СтркоаТабличнойЧасти поддерживает сериализацию?
|
|||
26
Лефмихалыч
08.07.15
✎
13:35
|
даже табличная часть целиком не поддерживает сериализацию отдельно от объекта
|
|||
27
mrpink
08.07.15
✎
13:38
|
...ну-ууу, я наивно предполагал, что если объект не может быть сериализован, то нужно просто описать схему
|
|||
28
Лефмихалыч
08.07.15
✎
13:45
|
(27) не, если объект не может быть сериализован, то платформа не предоставляет волшебных методов, с помощью которых из объекта одним вызовом можно xml-ку сделать. Перебирай кодом атрибуты, стряпай xml "руками".
Ты даже можешь назвать функцию для этого СериализоватьСтрокуТабличнойЧасти() - видал, какая гибкость? |
|||
29
mrpink
08.07.15
✎
13:53
|
дак так, оно но мне кажется логичным ожидать от платформы если я ей подсунул тип значения, типы всех свойств у неё есть, создать мне объект с полями такого-же типа и заполнить их сразу...в конце-концов если я не указываю, параметр он создает объект с нужными полями, только тип у них неопределено, после заполнить свойства у этих полей сразу свойства появляются... не пойму я чего-то
|
|||
30
Serginio1
08.07.15
✎
15:22
|
(15) В старых релизах для AnyRef ЗаполнитьЗначенияСвойств не работало. Приходилось вручную устанавливать значение
Например Тип=СериализаторXDTO.XMLТипЗнч(ТекОбъект.Проект); Объект.Проект=Фабрика.Создать(Фабрика.Тип(Тип.URIПространстваИмен, Тип.ИмяТипа),XMLСтрока(ТекОбъект.Проект)); |
|||
31
Лефмихалыч
08.07.15
✎
15:24
|
сегодня день долбанутых ожиданий. Во второй ветке подряд поциенты ожидают от платформы странного...
|
|||
32
mrpink
09.07.15
✎
02:53
|
а как описать в схеме элемент которого может не быть? ну тоесть есть свойсво объекта, которое по сути коллекция, но в конкретном файле в ней может элементов не быть, и ругается что не соответствует схеме
|
|||
33
France
09.07.15
✎
03:06
|
(31) брось позицию Шухарда. У тебя очень адекватные посты бывают - не снижай уровень троллингом))
|
|||
34
mrpink
09.07.15
✎
03:12
|
(32) с этим разобрался
|
|||
35
Лодырь
09.07.15
✎
04:20
|
А использовать готовый продукт для связи УППхи и PDM? наверняка форматы стандартизированы и уже учтены.
|
|||
36
mrpink
09.07.15
✎
05:41
|
(35) например?
|
|||
37
Лодырь
09.07.15
✎
07:18
|
(36) посмотреть в сторону http://solutions.1c.ru/pdm
|
|||
38
mrpink
09.07.15
✎
08:24
|
(37) не ну это вообще не вариант, смотрели конечно - 1с pdm в разы хуже специализированных, да и вообще есть куча отделов которые работают с одной системой, а тут ты такой не, давайте лучше 1с:pdm поставим, чтобы мне в упп ваши данные удобнее выгружать было
|
|||
39
Лодырь
09.07.15
✎
08:29
|
(38) Ну, хз если поковыряться и посмотреть тамошние импорты-экспорты вдруг что-то полезное можно найти?
|
|||
40
mrpink
09.07.15
✎
08:35
|
(39) Пожалуй. Вообще, задача то решена - всё чот нужно у меня грузится, просто в процессе возникло то чувство когда понимаешь что работает, но работает коряво, повод разобраться с XDTO. Я сегодня уже больше склоняюсь к (12) (13) спасибо ребятам))
|
|||
41
mrpink
09.07.15
✎
09:04
|
Всё-таки осталась одна проблема - в читаемом файле нет упоминания про пространство имен, я в пакете описал типы содержащиеся в файле, но когда читаю файл, с параметром тип, он его не узнает, не знаю что делать - хоть дописывать пространство в файл перед его прочтением. Может кто подскажет? Я так понимаю что нужно описываемые мною типы привязать к некому пространству имен по-умолчанию, или вообще его не указывать
|
|||
42
Serginio1
09.07.15
✎
10:23
|
(40) Посмотри КД3
|
|||
43
Serginio1
09.07.15
✎
10:26
|
||||
44
mrpink
09.07.15
✎
11:23
|
(43) спасибо конечно, но это к чему? Вопрос в следующем, есть файл xml, есть xdto схема этого файла, но в пакете определено пространство имен, а в файле нет, поэтому если я пытаюсь сказать фабрике чтобы она читая файл получала определенный тип данных она ругается, так как не узнает типа файла по имени(по имени без пространства имен) ,соответственно если в файл добавить этот параметр - указать xmlns="http://www.sample-package.org" то фабрика сразу начинает понимать тип... вот вопрос как зделать чобы она не обращала внимание на пространство имен
|
|||
45
Serginio1
09.07.15
✎
12:10
|
(44) Это к преобразоварнию данных из одного объекта в другой.
Так измени схему, либо измени файл. Но по моему в 1С нет возможности иметь схему без пространства имен. Попробуй. |
|||
46
Serginio1
09.07.15
✎
12:20
|
Можешь иметь два Фабрики.
Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме.xsd); |
|||
47
mrpink
09.07.15
✎
12:34
|
(46) я и так пробовал создавать свою фабрику, мне кажется если можно как-то повлиять на эти пространства имен в которых он ищет указанные типы, то это именно в своей фабрике а не в глобальной...но как пока не нашёл
|
|||
48
Serginio1
09.07.15
✎
12:59
|
(47) Каждый пакет привязан к своему пространству имен. Это является его идентификатором. Что бы ограничить использование пакетов создавай фабрику на основании пакетом.
ФабрикаXDTO(<Модель>, <Пакеты>) |
|||
49
mrpink
09.07.15
✎
14:10
|
(48) Не совсем понял Вас. Я создаю фабрику, другим конструктором, с одним параметром на основе набора схем XML, а что мне даст Ваш способ?
|
|||
50
Serginio1
09.07.15
✎
14:22
|
То есть пакеты у тебя в конфигураторе не прописаны?
У тебя для чтения XML должна быть своя фабрика содержащие пакеты с пространствами имен содержащимися в твоем XML. Если в XML другие пространства, то и считываться они не будут |
|||
51
Serginio1
09.07.15
✎
14:23
|
(49) Тебе проще создавать фабрику через 46
|
|||
52
mrpink
09.07.15
✎
14:34
|
(50) Нет, изначально я импортировал пакеты из xsd в конфигурацию, они(типы) стали доступны из глобальной фабрики, после этого я создавал свою фабрику, загружая схему из файла, тогда мои типы были в созданной фабрике, не помогло
|
|||
53
Serginio1
09.07.15
✎
14:37
|
(52) Так убери targetNamespace из XSD или задай ему ""
|
|||
54
Лефмихалыч
09.07.15
✎
14:37
|
(33) бросил. Спасибо.
|
|||
55
Serginio1
09.07.15
✎
16:18
|
Например
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> |
|||
56
Serginio1
09.07.15
✎
16:37
|
Специально проверил например описание такой схемы
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.3"> <xs:element name="Document-Invoice"> Загруженный через Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме.xsd); прекрасно читает такой файл <?xml version="1.0" encoding="utf-8"?> <Document-Invoice> <Invoice-Header> |
|||
57
Serginio1
09.07.15
✎
16:38
|
Правда при этом такой XSD в конфигурацию не подгружается
|
|||
58
Serginio1
09.07.15
✎
16:45
|
Сейчас проверил и прошу прощения. Не использует она фабрику при чтении. Все значения строковые.
|
|||
59
Serginio1
09.07.15
✎
16:47
|
На C# прекрасно используется правда для семерки.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |