Имя: Пароль:
1C
1С v8
Сериализатор 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