Имя: Пароль:
1C
1С v8
Выгрузка табличной части элемента справочника в XML
0 perpleks
 
26.11.15
14:56
Хочу попробовать сделать выгрузку в базу на планшете (мобильная платформа), сформировав на отправляющей стороне файл обмена, совпадающий со структурой принимающей базы. Для этого из приемника была экспортирована\импортирована в отправитель XML-схема в виде XDTO-пакета. Простые справочники выгружаются. Сейчас пытаюсь выгрузить элемент справочника с табличной частью:


Данные = ВыборкаИзменений.Получить();
URIИмен = "httpsomerandomshit";

ИмяОбъекта = "CatalogObject.Контрагенты";
ТипОбъекта = ФабрикаXDTO.Тип(URIИмен, ИмяОбъекта);
ОбъектОбмена = ФабрикаXDTO.Создать(ТипОбъекта);

ОбъектОбмена.Ref = Данные.Ссылка.УникальныйИдентификатор();
ОбъектОбмена.DeletionMark = Данные.ПометкаУдаления;
ОбъектОбмена.Code = Данные.Код;
ОбъектОбмена.Description = Данные.Наименование;
...
СписокСвойств = ОбъектОбмена.ПолучитьСписок("КонтактнаяИнформация");

Для Каждого КонтактИнф Из ТаблицаЗначений Цикл
  ТабЧасть = ФабрикаXDTO.Создать(СписокСвойств.ВладеющееСвойство.Тип);
  ТабЧасть.Тип = Строка(КонтактИнф.Тип);
  ТабЧасть.КонтактноеЛицо = КонтактИнф.Объект.Наименование;
  ТабЧасть.Сведения = КонтактИнф.Представление;
  СписокСвойств.Добавить(ТабЧасть);
КонецЦикла;

ФабрикаXDTO.ЗаписатьXML(ХМЛОбмен, ОбъектОбмена);


Читаю так:

ХМЛОбмен = Новый ЧтениеXML;
ХМЛОбмен.УстановитьСтроку(СообщениеОбмена);
СообщениеОбмена = ПланыОбмена.СоздатьЧтениеСообщения();
СообщениеОбмена.НачатьЧтение(ХМЛОбмен);
УзелОбмена = СообщениеОбмена.Отправитель;
    
Пока ВозможностьЧтенияXML(ХМЛОбмен) Цикл
  Данные = ПрочитатьXML(ХМЛОбмен);
  Данные.ОбменДанными.Отправитель = УзелОбмена;
  Данные.ОбменДанными.Загрузка = Истина;
  Данные.Записать();
КонецЦикла;
    
СообщениеОбмена.ЗакончитьЧтение();


Табличная часть таким образом не читается, поскольку получается такой XML:


<CatalogObject.Контрагенты>
  <Ref>7fb52921-41ba-11e5-c784-8666b8997cda</Ref>
  <DeletionMark>false</DeletionMark>
  <Code>Ц07777777</Code>
  <Description>ИП Пуп</Description>
  <КонтактнаяИнформация>
    <Тип>Адрес</Тип>
    <КонтактноеЛицо>Пупкин</КонтактноеЛицо>
    <Сведения>Победы ул, дом № 2</Сведения>
  </КонтактнаяИнформация>
  <КонтактнаяИнформация>
    <Тип>Адрес</Тип>
    <КонтактноеЛицо>Жупкин</КонтактноеЛицо>
    <Сведения>Поражения ул, дом № 2</Сведения>
   </КонтактнаяИнформация>
</CatalogObject.Контрагенты>


А нужен, я думаю, такой:

<CatalogObject.Контрагенты>
  <Ref>7fb52921-41ba-11e5-c784-8666b8997cda</Ref>
  <DeletionMark>false</DeletionMark>
  <Code>Ц07777777</Code>
  <Description>ИП Пуп</Description>
  <КонтактнаяИнформация>
    <ROW>
      <Тип>Адрес</Тип>
      <КонтактноеЛицо>Пупкин</КонтактноеЛицо>
      <Сведения>Победы ул, дом № 2</Сведения>
    </ROW>
    <ROW>
      <Тип>Адрес</Тип>
      <КонтактноеЛицо>Жупкин</КонтактноеЛицо>
      <Сведения>Поражения ул, дом № 2</Сведения>
    </ROW>
  </КонтактнаяИнформация>
</CatalogObject.Контрагенты>


Вопрос: как делать запись XML так, чтобы получалась структура как во втором варианте? Я уже отчаялся разобраться сам :(
1 Живой Ископаемый
 
26.11.15
15:10
Можно в ХМЛ строке слово КонтактнаяИнформация заменить на ROW.
А слов </Description> на  
</Description>
  <КонтактнаяИнформация>
а слово
</CatalogObject.Контрагенты>
на
</КонтактнаяИнформация>
</CatalogObject.Контрагенты>
2 perpleks
 
26.11.15
15:17
(1) В смысле, перетряхнуть весь XML целиком перед отправкой и поменять, что не нравится? Но тогда уж лучше изначально формировать его "врукопашную", безо всяких XDTO. Очень некрасивый костыль будет :(
3 Записьдампа
 
26.11.15
19:06
(0) Не нужен там ROW, если честно экспортировал/импортировал. У тебя в выходном XML указание пространства имен потеряно, и типизация не работает.
4 Рэйв
 
26.11.15
19:11
//-------
XML
i Как из одной базы перенести документ в другую базу?
// Выгрузить в файл xml.
ЗаписьXML=Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл("c:\doc.xml");
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");

// Получить объект по ссылке.
ВыгружаемыйОбъект=Документ.ПолучитьОбъект();

// С помощью средств сериализации записать объект в файл.
ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект);

ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();

ЧтениеXML=Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл("c:\doc.xml");

// Текущим становится элемент Root.
ЧтениеXML.Прочитать();

// Текущим становится элемент с документом.
ЧтениеXML.Прочитать();

// Проверить сможет ли с данным значением "справиться"
// система сериализации в данной базе.
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда

    // Получить ДокументОбъект.РеализацияТоваровУслуг
    ЗагружаемыйОбъект=ПрочитатьXML(ЧтениеXML);
    
    ЗагружаемыйОбъект.Записать();
КонецЕсли;

ЧтениеXML.Закрыть();
5 Рэйв
 
26.11.15
19:11
(С)
6 Рэйв
 
26.11.15
19:11
Это пример
7 Рэйв
 
26.11.15
19:11
как херней не заниматься:-)
8 Записьдампа
 
26.11.15
19:15
(4) Мимо тазика, к сожалению.

У него две разные конфигурации, соответственно разные фабрики XDTO с разными наборами пакетов/типов. При помощи одной из них он готовит xml для второй.
9 Рэйв
 
26.11.15
19:17
(8)Это ты не в тазик.
xml совершенно пофигу что в него запишут.
10 Рэйв
 
26.11.15
19:17
Если нормально подготовит все прочитается.
11 Записьдампа
 
26.11.15
19:47
(9)Концепция изменилась - пациент обгадился...

Вот для того чтобы подготовить xml как надо, ему и требуется попасть в квалифицированный тип - с указанием пространства имён. Кстати, напомни, пожалуйста, какое оно у объекта справочника конфигурации?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.