Имя: Пароль:
1C
 
Перенос подчиненного справочника через XDTO
0 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));
1 demiurggig
 
04.05.19
10:45
База - приемник

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

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

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

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

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

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

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

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