Имя: Пароль:
1C
 
Проблема с ЗаполнитьЗначенияСвойств элементов XDTO с неопределенным типом.
0 0xFFFFFF
 
12.11.10
09:46
Хочу выгрузить номенклатуру и базовую единицу через ХДТО.
Если делаю только номенклатуру, то все ок:

//Номенклатура - это поле на форме
   Пути = Новый Массив();
   Пути.Добавить("C:\Temp\1.xsd");
   Фабрика = СоздатьФабрикуXDTO(Пути);
   
   ТипНоменклатураОбъектХДТО = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Номенклатура");
   НоменклатураОбъектХДТО = Фабрика.Создать(ТипНоменклатураОбъектХДТО);
   ЗаполнитьЗначенияСвойств(НоменклатураОбъектХДТО, Номенклатура.ПолучитьОбъект());
   
   ЗаписьХМЛ = Новый ЗаписьXML;
   ЗаписьХМЛ.ОткрытьФайл("C:\Temp\1.xml");
   Фабрика.ЗаписатьXML(ЗаписьХМЛ, НоменклатураОбъектХДТО);
   ЗаписьХМЛ.Закрыть();

Если же добавляю выгрузку единицы:

ТипЕдиницаОбъектХДТО = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.ЕдиницыИзмерения");
ЕдиницаОбъектХДТО = Фабрика.Создать(ТипЕдиницаОбъектХДТО);
ЗаполнитьЗначенияСвойств(ЕдиницаОбъектХДТО, Номенклатура.ЕдиницаХраненияОстатков.ПолучитьОбъект());

То ругается на ЗаполнитьЗначенияСвойств
Ошибка установки значения свойства 'Владелец'
по причине:
Ошибка отображения типов:
Отображение типа 'СправочникСсылка.Номенклатура' в тип '{http://www.w3.org/2001/XMLSchema}string'
1 0xFFFFFF
 
12.11.10
09:47
Далее, смотрю в схеме тип элемента

<xsd:element name="Owner" type="v8ent:AnyRef"/>

Т.е. Владелец описан как AnyRef. Оно и понятно - поскольку у справочника могут быть владельцы разных типов.
2 0xFFFFFF
 
12.11.10
09:48
В связи с чем вопрос.
Как полю ЕдиницаОбъектХДТО.Owner присвоить тип, равный

ТипНоменклатураОбъектХДТО = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Номенклатура");

Перед ЗаполнитьЗначенияСвойств?
Уж очень неохота каждое поле описывать...
3 0xFFFFFF
 
12.11.10
09:51
Пытаюсь использовать метод приведения типов

Фабрика.Привести(ТипНоменклатураОбъектХДТО, ЕдиницаОбъектХДТО.Owner);

Но он не работает, т.к. ЕдиницаОбъектХДТО - является объектом ХДТО, а ЕдиницаОбъектХДТО.Owner - уже видимо нет..
4 0xFFFFFF
 
12.11.10
10:02
поднимем
5 0xFFFFFF
 
12.11.10
10:31
Да, и как записать два объекта ХДТО в ХМЛ? В форумах периодически поднимается эта тема, но народ пишет "все, разобрался". А как разобрался... короч одни вопросы.
6 DmitrO
 
12.11.10
10:34
Единица = Номенклатура.ЕдиницаХраненияОстатков.ПолучитьОбъект();
ТипВладельцаХДТО = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogRef.Номенклатура");
ЕдиницаОбъектХДТО.Owner = Фабрика.Создать(ТипВладельцаХДТО, Единица.Владелец);
ЗаполнитьЗначенияСвойств(ЕдиницаОбъектХДТО, Единица,, "Owner");
7 DmitrO
 
12.11.10
10:36
(5) Ответ: по спецификации XML в файле может быть только один корневой элемент. Делай выводы.
8 0xFFFFFF
 
12.11.10
10:48
(6) Отлично! Работает.
(7) Понял, сделал так:
ЗаписьХМЛ = Новый ЗаписьXML;
ЗаписьХМЛ.ОткрытьФайл("C:\Temp\1.xml");
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("Данные");
Фабрика.ЗаписатьXML(ЗаписьХМЛ, НоменклатураОбъектХДТО);
Фабрика.ЗаписатьXML(ЗаписьХМЛ, ЕдиницаОбъектХДТО);
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.Закрыть();

Только вот будет ли читаться через Сериализатор... Или нужно записывать с помощью DOM?
9 DmitrO
 
12.11.10
11:28
(8) будет читаться
10 DmitrO
 
12.11.10
11:32
(8) совет.
лучше еще вот это добавить:
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("Данные");
ЗаписьХМЛ.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config");
ЗаписьХМЛ.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
ЗаписьХМЛ.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");

разницу увидишь в выходных данных.
11 DmitrO
 
12.11.10
11:34
a читать так:
ЧтениеXML.ПерейтиКСодержимому(); //Переходим на узел начало элемента Данные
ЧтениеXML.Прочитать(); //Читаем узел следующий за узлом Данные
Пока ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл
  Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
  //тут можно записать Объект
КонецЦикла;
12 0xFFFFFF
 
12.11.10
11:56
ок, пасиб