Имя: Пароль:
1C
1С v8
8.1 СериализаторXDTO Отсутствует отображение для типа 'Структура'
,
0 MaxS
 
14.04.18
13:23
Нужно выгрузить структуру в xml файл. Код на платформе 8.1 генерирует ошибку, на 8.3 работает.

ЗначениеСвойства = Новый Структура("тест","тест");
ЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);

МойСериализаторXDTO = Новый СериализаторXDTO(МояФабрикаXDTO);
ЗначениеXDTO = МойСериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);

Текст ошибки:
Ошибка при вызове метода контекста (ЗаписатьXDTO): Ошибка отображения типов:
Отсутствует отображение для типа 'Структура'
ЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);
Или: ЗначениеXDTO = МойСериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);

Если из МояФабрикаXDTO убрать xsd схему "http://v8.1c.ru/8.1/data/core";, то ошибка появляется на любой платформе. Логично предположить, что в МояФабрикаXDTO загружены требуемые схемы. Почему не работает?
1 Franchiser
 
гуру
14.04.18
14:47
На клиенте делаешь?
2 MaxS
 
14.04.18
14:54
(1) Толстый клиент, платформа 8.1, конфигурация УТ 10.2.
Та же самая конфигурация на платформе 8.3 в режиме совместимости платформы 8.1, тот же код - всё работает.
3 Franchiser
 
гуру
14.04.18
17:50
Попробуй в модуль объекта вставить этот код
4 hhhh
 
14.04.18
18:11
(2) сама структура ни при чем. Это внутри структуры в одном из полей какая то фигня. Com-объект или еще что-то
5 Franchiser
 
гуру
14.04.18
18:16
В (0) в структуре только элемент "тест"
6 hhhh
 
14.04.18
18:21
а, блин - это 8.1
7 MaxS
 
14.04.18
21:16
(3) В модуле объекта и в модуле формы результат одинаков, пробовал.
8 MaxS
 
15.04.18
07:45
Решение нашлось. Поиск причин бага и его исправления более простым способом продолжается!

Информация по схеме "http://v8.1c.ru/8.1/data/core";
МойСериализаторXDTO.Фабрика.Пакеты[1].Количество() равно 43 на платформе 8.3 и равно 18 на платформе 8.1. Тип "Structure" почему-то пропадает.
Если загрузить такую же схему, изменив URI на такой  "http://v8.1c.ru/8.2/data/core";, на платформе 8.1 количество получаем 43.
Но МойСериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства) все равно не работает.
Нашлось обходное решение. Такая конструкция работает:
ТипСтруктура =  МояФабрикаXDTO.Тип("http://v8.1c.ru/8.2/data/core";, "Structure");
СтруктураXDTO = МояФабрикаXDTO.Создать(ТипСтруктура);
Далее дело техники в цикле рекурсивно обходим структуру и заполняем ОбъектXDTO
Вызывать функцию примерно так: ЗначениеXDTO = МояСтруктураВОбъектXDTO(ЗначениеСвойства, МойСериализаторXDTO);
Корректно обрабатываются такие значения:
ЗначениеСвойства1 = Новый Структура("тест3,тест4","тест",ТекущаяДата());
ЗначениеСвойства2 = Новый Структура("тест2",ЗначениеСвойства1);
ЗначениеСвойства = Новый Структура("тест",ЗначениеСвойства2);

После записи xml файла открываем его как текстовый и меняем "http://v8.1c.ru/8.2/data/core"; на "http://v8.1c.ru/8.1/data/core"; - такой вот костыль.
9 drei
 
15.04.18
12:51
(8) А с чего ты вообще взял, что это ошибка? 8.1 не умеет сериализовать структуру. Совсем. 8.3 в режиме совместимости дает тебе этот шанс. Так что меня платформу или засучивай рукава и пиши XML без обработки вручную.

Хотя можно еще повозмущаться, что 7.7 в XDTO не умеет, да.
10 MaxS
 
15.04.18
13:11
(9) Ну 8.1 не умеет и ладно. Почему фабрика, которую создали программно зависит от фабрики платформы?
Менять платформу - это не выход, т.к. моя цель предоставить решение для клиентов  с любой платформой.
И 7.7 можно заставить генерировать xml, пригодный для последующего разбора, тут вопросов нет, т.к. границы возможностей известны.
11 drei
 
15.04.18
13:24
(10) Потому что пространство имен.
12 MaxS
 
15.04.18
13:37
(11) Вероятно так и задумано, но неудобно. Если забыл указать какую-то схему в своей фабрике, то типовая не подхватывается, а если хочешь подменить типовую, то она мешается. Если разработчик так решил, значит так надо, зачем мешать и "баг" делать фичей? ;)
13 drei
 
15.04.18
13:54
(12) В пространство имен, например, "http://www.w3.org/2001/XMLSchema"; ничего не хочешь добавить? Ну слава Богу!