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