и вновь XDTO-фабрика

1. НебаЖитель 16.08.13 12:32 Сейчас в теме
Имеем код:

	ЗаписьXML = Новый ЗаписьXML;
	
	ЗаписьXML.УстановитьСтроку("UTF-8");
	ЗаписьXML.ЗаписатьОбъявлениеXML();					
	
	////////////////////////////////////////////////////////////­//////
	
	//создаем запись
	ТипОбъектаЗаписьИмпорта = ФабрикаXDTO.Тип("http://localhost/ws1", "InformationRegisterRecordSet.КонтактнаяИнформация");
	НоваяЗаписьИмпорта      = ФабрикаXDTO.Создать(ТипОбъектаЗаписьИмпорта);
		
	////
	
	ТипФильтрРегистра   = ФабрикаXDTO.Тип("http://localhost/ws1", "InformationRegisterRecordKey.КонтактнаяИнформация");
	НовыйФильтрРегистра = ФабрикаXDTO.Создать(ТипФильтрРегистра);
		
	НовыйФильтрРегистра.Объект 	= XMLСтрока("00000000-0000-0000-0000-000000000000");
	НовыйФильтрРегистра.Тип 	= XMLСтрока("Тест");
	НовыйФильтрРегистра.Вид		= XMLСтрока("Тест");
		
	////
	
	ТипЗаписьРегистра   = ФабрикаXDTO.Тип("http://localhost/ws1", "InformationRegisterRecord.КонтактнаяИнформация");
	НоваяЗаписьРегистра = ФабрикаXDTO.Создать(ТипЗаписьРегистра);
	
	НоваяЗаписьРегистра.Объект		  = XMLСтрока("00000000-0000-0000-0000-000000000000");
	НоваяЗаписьРегистра.Тип			  = XMLСтрока("Тест");
	НоваяЗаписьРегистра.Вид			  = XMLСтрока("Тест");
	НоваяЗаписьРегистра.Представление = XMLСтрока("Тест");
	
	////
	
	НоваяЗаписьИмпорта.Filter  = НовыйФильтрРегистра; 
	
	ТипЗапись   = ФабрикаXDTO.Тип("http://localhost/ws1", "Records.КонтактнаяИнформация");
	НоваяЗапись = ФабрикаXDTO.Создать(ТипЗапись);
	
	НоваяЗапись.Record.Добавить(НоваяЗаписьРегистра);
	НоваяЗаписьИмпорта.Records = НоваяЗапись;
	
	////
	
	ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, НоваяЗаписьИмпорта, "InformationRegisterRecord.КонтактнаяИнформация", "http://localhost/ws1",,НазначениеТипаXML.Явное);
		
	////////////////////////////////////////////////////////////­//////
	
	//удаляем пространство имен
	Результат = ЗаписьXML.Закрыть();
Показать


Результат кода:

<?xml version="1.0" encoding="UTF-8"?>
<InformationRegisterRecord.КонтактнаяИнформация xmlns="http://localhost/ws1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="InformationRegisterRecordSet.КонтактнаяИнформация">
	<Filter>
		<Объект>00000000-0000-0000-0000-000000000000</Объект>
		<Тип xsi:type="xs:string">Тест</Тип>
		<Вид xsi:type="xs:string">Тест</Вид>
	</Filter>
	<Records>
		<Record>
			<Объект>00000000-0000-0000-0000-000000000000</Объект>
			<Тип xsi:type="xs:string">Тест</Тип>
			<Вид xsi:type="xs:string">Тест</Вид>
			<Представление xsi:type="xs:string">Тест</Представление>
		</Record>
	</Records>
</InformationRegisterRecord.КонтактнаяИнформация>
Показать


А хотелось бы (явное указание типа в свойстве "Объект"):

<?xml version="1.0" encoding="UTF-8"?>
<InformationRegisterRecord.КонтактнаяИнформация xmlns="http://localhost/ws1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="InformationRegisterRecordSet.КонтактнаяИнформация">
	<Filter>
		<Объект xsi:type="CatalogRef.Контакты">00000000-0000-0000-0000-000000000000</Объект>
		<Тип xsi:type="xs:string">Тест</Тип>
		<Вид xsi:type="xs:string">Тест</Вид>
	</Filter>
	<Records>
		<Record>
			<Объект xsi:type="CatalogRef.Контакты">00000000-0000-0000-0000-000000000000</Объект>
			<Тип xsi:type="xs:string">Тест</Тип>
			<Вид xsi:type="xs:string">Тест</Вид>
			<Представление xsi:type="xs:string">Тест</Представление>
		</Record>
	</Records>
</InformationRegisterRecord.КонтактнаяИнформация>
Показать


Может кто знает, как это реализовать?
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Evil Beaver 8117 16.08.13 12:53 Сейчас в теме
(1) НебаЖитель, никак. А зачем это вам?
+
3. НебаЖитель 16.08.13 13:08 Сейчас в теме
(2) Evil Beaver, для того что бы СериализаторXDTO в другой базе его съел)
+
6. xzorkiix 34 16.08.13 13:32 Сейчас в теме
(1),(2) а что если , как это было в http://forum.infostart.ru/forum24/topic73409/message944769/#message944769 , тогда правда я пошел не потому пути - но мысль была одна пересобрать xml так, как это надо было мне :)
+
7. НебаЖитель 16.08.13 13:49 Сейчас в теме
(6) xzorkiix, от фабрики придется отказаться?) как не хотелось бы....
+
4. kasper076 103 16.08.13 13:17 Сейчас в теме
НовыйФильтрРегистра.Объект    = XMLСтрока("00000000-0000-0000-0000-000000000000");

Может потому, что собственно тип объекта-то и не указан?
+
5. НебаЖитель 16.08.13 13:20 Сейчас в теме
(4) kasper076,

	ТипОбъект   = ФабрикаXDTO.Тип("http://localhost/ws1", "CatalogRef.Контакты");
	НовыйФильтрРегистра.Объект = ФабрикаXDTO.Создать(ТипОбъект, XMLСтрока("00000000-0000-0000-0000-000000000000"));


Не помогает
+
8. НебаЖитель 16.08.13 17:51 Сейчас в теме
Проблему решил. Оказалось все просто. Если кому интересно, могу рассказать
+
9. logos 210 16.08.13 17:54 Сейчас в теме
(8) Так не стоит интриговать, Рассказывайте.
+
10. НебаЖитель 16.08.13 18:35 Сейчас в теме
Вообщем у свойства которого нам необходимо явное определение типа, задаем тип - anyType (http://www.w3.org/2001/XMLSchema)

Далее добавил новый тип - CatalogRef.Контакты, AnyRef (http://v8.1c.ru/8.1/data/enterprise)

Ну и присваиваю значение:

	
ТипОбъект   = ФабрикаXDTO.Тип("http://localhost/ws1", "CatalogRef.Контакты");
НоваяЗапись.Объект = ФабрикаXDTO.Создать(ТипОбъект, XMLСтрока("00000000-0000-0000-0000-000000000000"));


Итог:
<Filter>
  <Объект xsi:type="CatalogRef.Контакты">00000000-0000-0000-0000-000000000000</Объект>
</Filter>
+
11. Evil Beaver 8117 18.08.13 00:58 Сейчас в теме
(10) НебаЖитель, вы извращенец :) Эмулируете платформенные типы данных своими собственными.
Чтобы "СериализаторXDTO в другой базе его съел" вы должны в своей базе писать объект тоже СериализаторомXDTO, а не фабрикой.
Кстати, в один файл можно писать разными способами, половину файлов фабрикой, половину сериализатором. А указание типов у вас разное именно потому, что вы пишете Фабрикой, а читаете Сериализатором. Они создают разный по структуре XML текст. Это обоснованно, но лень расписывать в рамках комментария.
Создавать ваш файл надо сериализатором, тогда в другой базе он прочитается. И не надо городить огород со своими типами данных вида anyType.
+
12. НебаЖитель 18.08.13 23:14 Сейчас в теме
(11) Evil Beaver, это не я, это тз такое))

Задача просто сделать обмен между разными базами. Структура данных совершенно разная. Вот и приходится...
+
13. Evil Beaver 8117 19.08.13 09:38 Сейчас в теме
(12) НебаЖитель, понятно. Все равно, использовать нужно какой-то один способ сериализации, когда работаете со стандартными типами платформы. Фабрика и Сериализатор делают разный XML.
+
14. Alexion 44 19.08.13 11:07 Сейчас в теме
Для баз разной структуры фабрику не использовал, писал так:

Процедура ЗаписатьДанные(ЗаписьXML, Данные) Экспорт

Если ТипЗнч(Данные) = Тип("СправочникОбъект.Пользователи") Тогда
ПользователиЗаписатьXML(ЗаписьXML, Данные);
Иначе
// В данном случае, нет данных, которые требуют нестандартной обработки
// Записываем данные с помощью стандартного метода
ЗаписатьXML(ЗаписьXML, Данные);
КонецЕсли;

КонецПроцедуры

Процедура ПользователиЗаписатьXML(ЗаписьXML, Пользователь)

ЗаписьXML.ЗаписатьНачалоЭлемента("CatalogObject.Пользователи");
ЗаписатьXML(ЗаписьXML, Пользователь.Ссылка, "Ref", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, Пользователь.Наименование, "Description", НазначениеТипаXML.Явное);
ЗаписьXML.ЗаписатьКонецЭлемента();

КонецПроцедуры
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот