|   |   | 
| 
 | Перенос подчиненного справочника через 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 представление уникального идентификатора ссылки. Ты обычно запихиваешь туда что - то иное?! Ну давай, удиви меня, расскажи что именно. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |