|
Сериализатор XDTO | ☑ | ||
---|---|---|---|---|
0
80ksa
09.11.11
✎
04:44
|
Есть простой код
Валюта - реквизит формы - СправочникСсылка.Валюты //Здесь ФабрикаXDTO - глобальный объект, содержит все данные и все типы имеющиеся в конфигурации Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO); Запись = Новый ЗаписьXML; Запись.ОткрытьФайл("C:\XDTOSample.xml"); ВалютаОбъект = Валюта.ПолучитьОбъект(); Сериализатор.ЗаписатьXML(Запись, ВалютаОбъект); Запись.Закрыть(); После этого кода создается XML файл, в котором записана выбранная валюта со всеми реквизитами. Если нужно создать свою систему, где например, валюта сериализуется в XML не по всем реквизитам, а только по некоторым, значит логично нужно создать свой пакетXDTO, на основании него создать ФабрикуXDTO и сформировать XML, как и выше, а именно, указать Сериализатору ВалютуОбъект, которую он по правилам, имеющимся в фабрике обработает. написал код //создадим свою фабрику на основании своего пакета, в этом пакете описан спр. Валюты с двумя реквизитами код и наименование. НаборСхем = ФабрикаXDTO.ЭкспортСхемыXML("http://myserver.ru/samle"); Фабрика = Новый ФабрикаXDTO(НаборСхем); //сериализатор теперь создан на основании нашей фабрики, а не глобальной Сериализатор = Новый СериализаторXDTO(Фабрика); //далее, все также Запись = Новый ЗаписьXML; Запись.ОткрытьФайл("C:\XDTOSample.xml"); ВалютаОбъект = Валюта.ПолучитьОбъект(); Сериализатор.ЗаписатьXML(Запись, ВалютаОбъект); Запись.Закрыть(); но в итоге выдает ошибку {Форма.Форма.Форма(64)}: Ошибка при вызове метода контекста (ЗаписатьXML) Сериализатор.ЗаписатьXML(Запись, ВалютаОбъект); по причине: Несоответствие типов (параметр номер '2') (Ошибка отображения типов) Как будто бы требует, что бы тип был не СправочникОбъект, а объектXDTO кто пробовал создавать свои пакетыXDTO ,а ФабрикуXDTO программно. КАК потом происходит сериализация: способом указанным выше или заполняется каждый реквизит в отдельности? |
|||
1
Amiralnar
09.11.11
✎
06:31
|
Вроде в демо конфигурации по веб сервисам - происходит заполнение каждого реквизита. Только сперва создается объект вашего типа, и на него ЗаполнитьЗначенияСвойств. Вроде так.
|
|||
2
80ksa
09.11.11
✎
06:55
|
Благодарю, этот способ мне известен. Буду хитрить дальше, попробую свою фабрику создать на основе схемы XML (*.xsd)
|
|||
3
80ksa
09.11.11
✎
08:57
|
Итак, воспользовавшись (1), имеем:
//это только для того, чтобы создать свою фабрику, а не использовать глобальную Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл("C:\XMLSchema.xsd"); ПостроительДом = Новый ПостроительDOM; ДокументДом = ПостроительДом.Прочитать(Чтение); ПостроительСхемы = Новый ПостроительСхемXML; СхемаХМЛ = ПостроительСхемы.СоздатьСхемуXML(ДокументДом); НаборСхемХМЛ = Новый НаборСхемXML; НаборСхемХМЛ.Добавить(СхемаХМЛ); Фабрика = Новый ФабрикаXDTO(НаборСхемХМЛ); //создали //свой сериализатор XDTO, записываем XML файл Сериализатор = Новый СериализаторXDTO(Фабрика); Запись = Новый ЗаписьXML; Запись.ОткрытьФайл("C:\XDTOSample.xml"); ВалютаТип = Фабрика.Тип("http://myserver.ru/samle","Валюта"); ВалютаXDTO = Фабрика.Создать(ВалютаТип); ЗаполнитьЗначенияСвойств(ВалютаXDTO,Валюта); Сериализатор.Фабрика.ЗаписатьXML(Запись, ВалютаXDTO); Запись.Закрыть(); // в итоге имеем красивый файл-xml <Валюта xmlns="http://myserver.ru/samle" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Код>840</Код> <Наименование>USD</Наименование> </Валюта> А именно, записались реквизиты только те, которые соответствуют моему пакету, в нем определено два реквизита Код и Наименование у типа объекта. Но теперь не читается файл с данными, обратно не сериализует. ПРИЧИНА: Ошибка отображения типов: Отсутствует отображение для типа '{http://myserver.ru/samle}Валюта' ДЕЙСТВИТЕЛЬНО, для типа объекта Валюта в пакете Базовый тип не указан. Если его указать как CatalogObject.Валюты ИЗ http://v8.1c.ru/8.1/data/enterprise/current-config, то при проверке пакета будет ошибка: Базовый тип отсутствует CatalogObject.Валюты или не определен; Если это пространство имен добавить в пакете как Директивы импорта, тогда проверка пакета удачна, но при выполнении кода ошибка даже на этапе создания фабрики Фабрика = Новый ФабрикаXDTO(НаборСхемХМЛ) --- Импортируемый пакет типов 'http://v8.1c.ru/8.1/data/enterprise/current-config' не определен. Ну что всех запутал, я сам запутался, подскажите еще мысли. Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл("C:\XDTOSample.xml"); НоваяВалюта = Сериализатор.ПрочитатьXML(Чтение); Чтение.Закрыть(); |
|||
4
Amiralnar
09.11.11
✎
16:00
|
А сериализатор у тебя на основании какой фабрики? Должен быть твой пакет XDTO, как понимаю. И прочитаешь ты РОВНО то и такого типа, что ты удачно записал в первом примере.
А потом, как я понимаю, ты создаешь валюту метедом "Справочники.Валюты.СоздатьЭлемент()", и в нем заполняешь свойства из прочитанного объекта методом "ЗаполнитьЗначенияСвойств" Демонстрационная конфигурация "Web-сервисы" иллюстрирует использование следующих механизмов: определение Web-сервиса; определение схемы данных; получение описания Web-сервиса; динамическое создание прокси Web-сервиса; статическое создание прокси Web-сервиса на основе WS-ссылки; вызов операции Web-сервиса; работу с объектами передачи данных (XDTO). http://v8.1c.ru/metod/Methodical_DemoConf.htm |
|||
5
80ksa
11.11.11
✎
03:59
|
благодарю за советы, частично ими воспользовавшись имеем схему обмена для разнородных конфигураций через XDTO:
в документе расходная накладная: роцедура ОсновныеДействияФормыВыгрузить(Кнопка) НаборСхемXML = ФабрикаXDTO.ЭкспортСхемыXML("http://www.sample-package.org"); //создаем свою фабрику Фабрика = Новый ФабрикаXDTO(НаборСхемXML); Запись = Новый ЗаписьXML; Запись.ОткрытьФайл("C:\XDTOSample.xml"); ДокументТип = Фабрика.Тип("http://www.sample-package.org","Документ"); НоменклатураТип = Фабрика.Тип("http://www.sample-package.org","Номенклатура"); ЭлементСоставаТип = Фабрика.Тип("http://www.sample-package.org","ЭлементСостава"); ИдентификаторТип = Фабрика.Тип("http://v8.1c.ru/8.1/data/core","UUID"); ДокументXDTO = Фабрика.Создать(ДокументТип); ДокументXDTO.Дата = Дата; ДокументXDTO.Номер = Номер; Для Каждого эл ИЗ Товары Цикл НоменклатураXDTO = Фабрика.Создать(НоменклатураТип); НоменклатураXDTO.Идентификатор = Фабрика.Создать(ИдентификаторТип, эл.Номенклатура.УникальныйИдентификатор()); ЭлементСоставаXDTO = Фабрика.Создать(ЭлементСоставаТип); ЭлементСоставаXDTO.Номенклатура = НоменклатураXDTO; ЭлементСоставаXDTO.Количество = эл.Количество; ДокументXDTO.Товары.Добавить(ЭлементСоставаXDTO); КонецЦикла; Фабрика.ЗаписатьXML(Запись, ДокументXDTO); Запись.Закрыть(); КонецПроцедуры После нажатия кнопки имеем файл xml (фрагмент) <Документ xmlns="http://www.sample-package.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Номер>УН000000136</Номер> <Дата>2011-01-29T19:25:42</Дата> - <Товары> - <Номенклатура> <Идентификатор>0ea7522b-b18f-463f-a8e8-599d50fcebd3</Идентификатор> </Номенклатура> <Количество>2</Количество> </Товары> - <Товары> - <Номенклатура> <Идентификатор>f989d8bc-014f-4cd3-8b76-8ad25b1b37d3</Идентификатор> </Номенклатура> <Количество>1</Количество> </Товары> - <Товары> в документе приходная накладная: Процедура ОсновныеДействияФормыЗагрузить(Кнопка) Товары.Очистить(); //создаем свою фабрику НаборСхемXML = ФабрикаXDTO.ЭкспортСхемыXML("http://www.sample-package.org"); Фабрика = Новый ФабрикаXDTO(НаборСхемXML); ДокументТип = Фабрика.Тип("http://www.sample-package.org","Документ"); Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл("C:\XDTOSample.xml"); ДокументXDTO = Фабрика.ПрочитатьXML(Чтение,ДокументТип); Чтение.Закрыть(); НомерВходящегоДокумента = ДокументXDTO.Номер; ДатаВходящегоДокумента = ДокументXDTO.Дата; Для Каждого эл ИЗ ДокументXDTO.Товары Цикл Ном = Справочники.Номенклатура.ПолучитьСсылку(эл.Номенклатура.Идентификатор); н = Товары.Добавить(); н.Количество = эл.Количество; Если НЕ ЗначениеЗаполнено(Ном) Тогда Продолжить; КонецЕсли; н.Номенклатура = Ном; КонецЦикла; КонецПроцедуры Где http://www.sample-package.org -это пакет XDTO, созданный в ветке конфигурации ОБЩИЕ, и который присутствует в конфигурации источнике и конфигурации приемнике, пакет самодостаточен, т.е. не ссылается другие пространства имен, типа http://v8.1c.ru/8.1/data/enterprise/current-config |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |