Вход | Регистрация
 

Перенос подчиненного справочника через XDTO

Перенос подчиненного справочника через XDTO
Я
   demiurggig
 
04.05.19 - 10:45
Обычные справочники передаются без проблем, а с подчиненным возникли сложности. Не подскажите, в чем ошибка? Код в базе - источнике:                                                                                                                    СпецификацияТип = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config";, "CatalogObject.Спецификации");
    МассивСтрокЗаписи = Новый Массив;
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ Ссылка, Владелец
    |ИЗ Справочник.Спецификации";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ЗаписьХМЛ = Новый ЗаписьXML;
        ЗаписьХМЛ.УстановитьСтроку();
        СпецификацияОбъект = Фабрика.Создать(СпецификацияТип);
        СпецификацияОбъект.Code = Выборка.Ссылка.Код;
        СпецификацияОбъект.Description = Выборка.Ссылка.Наименование;
        СпецификацияОбъект.DeletionMark = Выборка.Ссылка.ПометкаУдаления;
        СпецификацияОбъект.PredefinedDataName = Выборка.Ссылка.ИмяПредопределенныхДанных;
        СпецификацияОбъект.Owner = XMLСтрока(Выборка.Владелец);
        СпецификацияОбъект.Ref = XMLСтрока(Выборка.Ссылка);

        Фабрика.ЗаписатьXML(ЗаписьХМЛ, СпецификацияОбъект);
        СтрокаЗаписи = ЗаписьХМЛ.Закрыть();
        МассивСтрокЗаписи.Добавить(СтрокаЗаписи);
    КонецЦикла;
    
    Возврат Новый ХранилищеЗначения(МассивСтрокЗаписи, Новый Сжатиеданных(9));
 
 
   demiurggig
 
1 - 04.05.19 - 10:45
База - приемник 

    МассивСтрокЗаписи = Прокси.GetNomenclature().Получить();
    Для Каждого Строка Из МассивСтрокЗаписи Цикл
        ЧтениеХМЛ.УстановитьСтроку(Строка);
        объ = СериализаторXDTO.ПрочитатьXML(ЧтениеХМЛ);
        Попытка
            объ.Записать();
        Исключение
            ОписаниеОшибки = ОписаниеОшибки();    
        КонецПопытки;
    КонецЦикла;
    ЧтениеХМЛ.Закрыть();
   demiurggig
 
2 - 04.05.19 - 10:49
   Ёпрст
 
3 - 04.05.19 - 10:58
(0) тип кода какой ? Число поди ?

И это, получать все значчения нужно в тексте запроса.. писать Выборка.ССылка.Нечто - моветон
   demiurggig
 
4 - 04.05.19 - 11:00
тип кода строка

А в чем проблема получать значения от Ссылки, это же просто указатель на структуру в памяти?
   demiurggig
 
5 - 04.05.19 - 11:07
4+ Здесь что - то, связанное с подчинённостью. Стоит убрать в конфигураторе у справочника Спецификации признак подчиненности справочнику Номенклатура, и СериализаторXDTO прекрасно читает xml строку.
   Вася Теркин
 
6 - 04.05.19 - 11:24
СпецификацияОбъект.Ref, СпецификацияОбъект.Owner типа uuid ? Зачем тебе XML?
   demiurggig
 
7 - 04.05.19 - 11:42
(6) В смысле? А как ты ссылку в xml файл по другому запишешь?
   demiurggig
 
8 - 04.05.19 - 11:44
0+
Если строку
        //СпецификацияОбъект.Code = Выборка.Ссылка.Код;

закомментировать, то начинает ругаться на Description и так далее по списку.
   demiurggig
 
9 - 04.05.19 - 16:27
расследование показало, что десериализация вот такого файла приводит к к ошибке

<CatalogObject.Спецификации xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
    <Ref>d37722b5-6cd9-11e9-93af-8c16454e3d70</Ref>
    <DeletionMark>false</DeletionMark>
    <Owner>d37722b4-6cd9-11e9-93af-8c16454e3d70</Owner>
    <Code>000000001</Code>
    <Description>Основная</Description>
    <PredefinedDataName/>
</CatalogObject.Спецификации>
   demiurggig
 
10 - 04.05.19 - 16:29
Но если в элемент Owner добавить аотрибут xsi:type="CatalogRef.Номенклатура", то все загружается без проблем

<?xml version="1.0" encoding="ISO-8859-1"?>
<CatalogObject.Спецификации xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config">;
<Ref>d37722b5-6cd9-11e9-93af-8c16454e3d70</Ref>
<DeletionMark>false</DeletionMark>
<Owner xsi:type="CatalogRef.Номенклатура">d37722b4-6cd9-11e9-93af-8c16454e3d70</Owner>
<Code>000000001</Code>
<Description>Основная</Description>
<PredefinedDataName/>
</CatalogObject.Спецификации>
   demiurggig
 
11 - 04.05.19 - 16:31
Получается, что сериализатору XDTO нужен этот атрибут, чтобы успешно создать объект 1С. Как его добавить?
   demiurggig
 
12 - 04.05.19 - 16:37
11+ Можно, конечно, дописать его руками. Но, наверное, здесь что - то не учтено при сериализации собственно. Фабрику я создаю на основе экспортированной в схему xml глобальной фабрики XDTO базы - приемника. И там, кстати, справочник спецификации описан вот так:

    <xs:complexType name="CatalogObject.Спецификации">
        <xs:sequence>
            <xs:element name="Ref" type="tns:CatalogRef.Спецификации"/>
            <xs:element name="DeletionMark" type="xs:boolean"/>
            <xs:element name="Owner" type="ent:AnyRef" nillable="true"/>
            <xs:element name="Code" type="xs:string"/>
            <xs:element name="Description" type="xs:string"/>
            <xs:element name="PredefinedDataName" type="xs:string" minOccurs="0"/>
            <xs:element name="Комплектующие" type="tns:CatalogTabularSectionRow.Спецификации.Комплектующие" minOccurs="0" maxOccurs="99999"/>
        </xs:sequence>
    </xs:complexType>
   zwolf
 
13 - 04.05.19 - 16:50
(12) Сделать сериализацию вменяемо:

СпецификацияОбъект = Выборка.Ссылка.ПолучитьОбъект();
СериализаторXDTO.ЗаписатьXML(ЗаписьХМЛ, СпецификацияОбъект);
   demiurggig
 
14 - 04.05.19 - 18:23
(13) Вменяемо то оно вменяемо, когда у вас обмен между идентичными конфигурациями. Мой случай не такой простой, с какими работаете вы. У меня структура справочников различная.
   demiurggig
 
15 - 04.05.19 - 18:25
14+ И выше я писал, что фабрику получаю из xsd файла. Можно было понять, что 13 - не мой случай. Если быть более внимательным.
   zwolf
 
16 - 04.05.19 - 19:40
(15) Ну, поехали путем длинным.

У тебя в схеме явно описан тип реквизита Owner - тип "AnyRef" из пространства имен, обозначенным префиксом "ent". А ты деловито запихиваешь туда строку, которая вообще-то типа "string" из пространства префикса "xs", которое "http://www.w3.org/2001/XMLSchema";. Надо быть более внимательным!
   demiurggig
 
17 - 04.05.19 - 20:22
(16) Ты вообще из своей реальности вынырнул? Вопрос стоит в том, почему при сериализации автоматически не прописывается атрибут xsi:type="CatalogRef.Номенклатура"? Не можешь понять о чем спрашивают?
   Chameleon1980
 
18 - 05.05.19 - 08:14
{17} а должен прописывать?
   demiurggig
 
19 - 06.05.19 - 09:26
(18) В этом и вопрос. Опыт показал, что когда сериализация идет посредством сериализатора XDTO, то атрибут прописывается. Но если мы сами собираем XDTO объект (так как конфигурации баз различные и я работаю со своей фабрикой) и в дальнейшем сериализуем его в xml посредством фабрики ...Фабрика.ЗаписатьXML(ЗаписьХМЛ, СпецификацияОбъект)... то не прописывается. Тут два варианта:

1. Я что - то не учел при создании своей фабрики
2. Это косяк 1С

К сожалению документации по XDTO почти никакой, поэтому прошу помощи у знающих людей.
   demiurggig
 
20 - 06.05.19 - 09:48
(16) << А ты деловито запихиваешь туда строку, которая вообще-то типа "string"

Я "запихиваю" туда не строку, а XML представление уникального идентификатора ссылки. Ты обычно запихиваешь туда что - то иное?! Ну давай, удиви меня, расскажи что именно.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.