Имя: Пароль:
1C
1С v8
Сериализация 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# прекрасно используется правда для семерки.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший