|
Сериализация объекта | ☑ | ||
---|---|---|---|---|
0
alexei366
18.02.14
✎
12:18
|
Чот не пойму, есть xml , в нем ДокументОбъект, десериализую xml в объект базы данных и теряю нафиг ссылку, т.е. в xml ссылка есть а после десереализации данные все остаются а ссылка теряется (точнее обнуляется).
Из-за чего такое может происходить? Платформа 8.3.4.389 |
|||
1
Apokalipsec
18.02.14
✎
12:20
|
It's magic.
|
|||
2
alexei366
18.02.14
✎
12:24
|
(1) Я тож так думаю, но чот слабо вериться, мне кажеться есть какаято гребанная особенность
|
|||
3
Spieluhr
18.02.14
✎
12:52
|
(2) код чтоли покажи
|
|||
4
grigo
18.02.14
✎
12:57
|
Я не в теме, но может попробовать УстановитьСсылкуНового() ?
|
|||
5
alexei366
18.02.14
✎
13:02
|
(4) он блин не новый в этом то и фишка
|
|||
6
alexei366
18.02.14
✎
13:02
|
(3) ОбъектДок = Неопределено;
Если РаботаСXML_Сервер.ПолучитьЗначениеИзСериализованнойСтроки(,ОбъектДок_Строка,ОбъектДок,ОписаниеОшибки) = Ложь Тогда Перейти ~Ошибка; КонецЕсли; |
|||
7
alexei366
18.02.14
✎
13:03
|
(6) До выполнения есть ссылка, после нету
|
|||
8
Жан Пердежон
18.02.14
✎
13:04
|
(6) показал так показал
|
|||
9
alexei366
18.02.14
✎
13:04
|
(8) А тебе что ещё надо?
|
|||
10
grigo
18.02.14
✎
13:06
|
Конфу назови хотя бы )))
|
|||
11
grigo
18.02.14
✎
13:07
|
(9) ты используешь неплатформенную функцию. Хз что она там делает. Конфу называй.
|
|||
12
1Сергей
18.02.14
✎
13:08
|
(7) >>До выполнения есть ссылка, после нету
где есть? в ОбъектДок??? |
|||
13
Apokalipsec
18.02.14
✎
13:10
|
(12) ОбъектДок = Неопределено; - Там явно ничего нет до выполнения.))
Конкурс телепатов переходит к своей финальной части, ещё несколько часов и мы расколем автора. |
|||
14
Рэйв
18.02.14
✎
13:13
|
(6)За Перейти в коленки не стреляют у вас там:-)
|
|||
15
alexei366
18.02.14
✎
13:16
|
(12) Есть в ОбъектДок_Строка <Ref>1539baf3-9872-11e3-ad9a-005056b26ee0</Ref>
|
|||
16
alexei366
18.02.14
✎
13:16
|
(10) Самописка
|
|||
17
zmaximka
18.02.14
✎
13:16
|
сериализовал, сериализовал, да не высериализовал
|
|||
18
alexei366
18.02.14
✎
13:17
|
(11) Функция ПолучитьЗначениеИзСериализованнойСтроки(ВхСериализаторXDTO = Неопределено,Строка,ВыходноеЗначение,ОписаниеОшибки) Экспорт
Попытка Если ВхСериализаторXDTO = Неопределено Тогда ТекСериализаторXDTO = СериализаторXDTO; Иначе ТекСериализаторXDTO = ВхСериализаторXDTO; КонецЕсли; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(Строка,,); ВыходноеЗначение = ТекСериализаторXDTO.ПрочитатьXML(ЧтениеXML,); Исключение ОписаниеОшибки = ОписаниеОшибки(); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции |
|||
19
grigo
18.02.14
✎
13:17
|
(13) Автор имеет в виду, что как бы заново загружается объект, который уже есть в базе.
Дело, очевидно, в функции РаботаСXML_Сервер, которая не является платформенной, следовательно, бага именно там. |
|||
20
alexei366
18.02.14
✎
13:17
|
(14) Что это значит?
|
|||
21
alexei366
18.02.14
✎
13:18
|
(19) см выше ищи багу)
|
|||
22
Рэйв
18.02.14
✎
13:19
|
(20)Это значит что за оператор вида "Перейти ~" в приличных домах Филадельфии отстреливают конечности:-)
|
|||
23
Рэйв
18.02.14
✎
13:19
|
Может стоит помедитировать над :
Как из одной базы перенести документ в другую базу? // Выгрузить в файл xml. ЗаписьXML=Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл("c:\doc.xml"); ЗаписьXML.ЗаписатьНачалоЭлемента("Root"); // Получить объект по ссылке. ВыгружаемыйОбъект=Документ.ПолучитьОбъект(); // С помощью средств сериализации записать объект в файл. ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.Закрыть(); ЧтениеXML=Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл("c:\doc.xml"); // Текущим становится элемент Root. ЧтениеXML.Прочитать(); // Текущим становится элемент с документом. ЧтениеXML.Прочитать(); // Проверить сможет ли с данным значением "справиться" // система сериализации в данной базе. Если ВозможностьЧтенияXML(ЧтениеXML) Тогда // Получить ДокументОбъект.РеализацияТоваровУслуг ЗагружаемыйОбъект=ПрочитатьXML(ЧтениеXML); ЗагружаемыйОбъект.Записать(); КонецЕсли; ЧтениеXML.Закрыть(); |
|||
24
alexei366
18.02.14
✎
13:19
|
(13) ОбъектДок_Строка это текст xml там есть <Ref>1539baf3-9872-11e3-ad9a-005056b26ee0</Ref>
|
|||
25
alexei366
18.02.14
✎
13:19
|
(24) Телепатом быть необязательно)
|
|||
26
grigo
18.02.14
✎
13:20
|
(20) Есть ряд операторов, использование которых в классическом программировании считалось "дурным тоном". В современном программировании многие из них были реабилитированы, за исключением оператора "Перейти".
|
|||
27
alexei366
18.02.14
✎
13:21
|
(23) Можно конеш эти методы попробывть, я наверно потесчу
|
|||
28
Рэйв
18.02.14
✎
13:22
|
(27)Это какбэ классика:-) И их "нужно", а не "можно":-)
|
|||
29
Принт
18.02.14
✎
13:22
|
в 1С Перейти можно
|
|||
30
alexei366
18.02.14
✎
13:22
|
(26) Знаю, мож думать как хош, тока в 1С когда делаешь попытку-исключение, нету как в C# ветки которая выполняется в независимости от того было ли исключение или нет. Приходиться делать так
|
|||
31
alexei366
18.02.14
✎
13:23
|
(28) А чем плоха моя функция объясни?
|
|||
32
Рэйв
18.02.14
✎
13:24
|
(29)Но не нужно:-) Особенно в контексте вывода ошибки. Тут вызов процедуры - наше все.
|
|||
33
Рэйв
18.02.14
✎
13:24
|
(31)Тем, что она не работает(С)Ваш КО
|
|||
34
alexei366
18.02.14
✎
13:25
|
(33) попонятней объясни
|
|||
35
Рэйв
18.02.14
✎
13:26
|
(34)Ну ты тему почему создал? Потому чтот твой метод не работает. Ну вот.
|
|||
36
grigo
18.02.14
✎
13:27
|
(30) не поверишь )))
Попытка ОператорыВыполняемыеВЛюбомСлучае1; ПроверкаПопытки; ОператорыУдачнойПопытки; Исключение ОператорыИсключения; КонецПопытки ОператорыВыполняемыеВЛюбомСлучае2; |
|||
37
alexei366
18.02.14
✎
13:28
|
(35) Есть другой пример в моей "мега конфе" припилина версионность (своя) в этому доку и есть метод вызываемый с формы списка версий который лезит в регистр сведений, получает XML и через туже функцию создает объект и пихает его в Объект формы . И вот в этом случае проблем нету таких (новых объектов у меня после загрузки версии не создается)
|
|||
38
alexei366
18.02.14
✎
13:29
|
(36) А если блин мне я в исключении выхожу из функции, чо тогда попа?
|
|||
39
alexei366
18.02.14
✎
13:30
|
(36) Можно по разному, но мне кажеться через Перейти код получается более удобным и читаемым
|
|||
40
Принт
18.02.14
✎
13:30
|
(36) и я не поверю
|
|||
41
Рэйв
18.02.14
✎
13:30
|
(38)так ты выход напиши после ОператорыВыполняемыеВЛюбомСлучае
|
|||
42
alexei366
18.02.14
✎
13:31
|
(41) Успокойтесь ближе к теме
|
|||
43
Рэйв
18.02.14
✎
13:31
|
(42)Ты (23) попробовал?
|
|||
44
alexei366
18.02.14
✎
13:32
|
(43) Нет пока, ты мне не объяснил чем моя функция плоха)) (ща попробую дайте 10 мин)
|
|||
45
grigo
18.02.14
✎
13:32
|
(38) Нет, не попа. Голова. Голова - тогда можно будет обойтись без "перейти". Но и на этот раз помогу. Ты возвращаешь Истина, если попытка удалась. Тогда
ПопыткаУдалась = НазваниеТвоейФункции(); ОператорыВыполняемыеВЛюбомСлучае1; Если ПопыткаУдалась Тогда ... Иначе ... КонецЕсли; ОператорыВыполняемыеВЛюбомСлучае2; ))))))) |
|||
46
Принт
18.02.14
✎
13:35
|
перейти к обработчику ошибки - легко узнаваемая классика. пусть живёт
|
|||
47
Рэйв
18.02.14
✎
13:37
|
(46)Перейти к обработчику - это вообщето вызвать процедуру обработчика, а никак не Перейти ~
|
|||
48
grigo
18.02.14
✎
13:38
|
(46) Обработчик ошибки - это после слова ИНАЧЕ в (45). Выполняется при ошибке и не выполняется, если все ок.
|
|||
49
Принт
18.02.14
✎
13:39
|
(47) контекст передавать можно задолбаться
|
|||
50
Рэйв
18.02.14
✎
13:41
|
(49)Чего его передавать если можно в том же модуле написать процедуру?
|
|||
51
grigo
18.02.14
✎
13:41
|
(49) Ладно, давай так. Автор пишет
Если НЕ Попытка удалась Тогда Перейти ... КонецЕсли. А почему бы не так Если НЕ Попытка удалась Тогда ОбработкаОшибки; КонецЕсли. ??????? Это гораздо читабельнее. |
|||
52
Принт
18.02.14
✎
13:42
|
(50) можно. я во-общем
|
|||
53
alexei366
18.02.14
✎
13:50
|
По сути Перейти я использую для случаев, когда в функции создается некий к примеру ComОбъект (возьмём Word) затем выполняется код состоящий из вызова 10 методов каждый из которых возвращает мне результат (Успех или ошибка) и если результат является ошибкой я прекращаю выполнение функции и выхожу из функции с "Ложью". И тут оно самое Word же к примеру фиг закроется если не заюзать "Close()", а будет висеть процесс даже если 1С закрыть, и вот его надо обязательно закрыать в какойбы из функций не произошла ошибка (и ошибка в функции не означает что выбо какоето исключение)
|
|||
54
alexei366
18.02.14
✎
14:06
|
(23) Чот xml вообще другая получается нежели через сериализатор. Но через сериализатор она хотя бы с пространством имен, а через ЗаписатьXML без
|
|||
55
alexei366
18.02.14
✎
14:13
|
(54) Ладно ща встрою код на глобальные ЗаписатьXML и ПрочитатьXML, посмотрим как оно отработает
|
|||
56
alexei366
18.02.14
✎
14:19
|
(55) Фига лысово, через эти методы такаяже фигня
|
|||
57
alexei366
18.02.14
✎
14:22
|
Есть кто?
|
|||
58
Spieluhr
18.02.14
✎
14:43
|
Функция ПолучитьОбъектИзXML(ДвоичныеДанные)
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные); Если ЧтениеXML.Прочитать() Тогда Если ВозможностьЧтенияXML(ЧтениеXML) Тогда Объект = ПрочитатьXML(ЧтениеXML); ЧтениеXML.Закрыть(); Возврат Объект; Иначе ЧтениеXML.Закрыть(); ВызватьИсключение НСтр("ru = 'Ошибка при восстановлении объекта'"); КонецЕсли; Иначе ЧтениеXML.Закрыть(); ВызватьИсключение НСтр("ru = 'Ошибка чтения данных'"); КонецЕсли; КонецФункции |
|||
59
alexei366
19.02.14
✎
10:19
|
Народ есть идеи почему ссылка обнуляется?
|
|||
60
alexei366
19.02.14
✎
11:32
|
Есть кто? у меня новая мысля
|
|||
61
МишельЛагранж
19.02.14
✎
13:20
|
(60) какая? опять по поводу доработки платформы 1С?
|
|||
62
alexei366
19.02.14
✎
13:28
|
(61) Нет, по поводу исчезающей ссылки при десериализации объекта
|
|||
63
МишельЛагранж
19.02.14
✎
13:36
|
(62) поймите, что в 1С все предельно упрощено.
Вы преобразуете не ссылку саму по себе, а объект раскладываете на "составляющие" в виде текстовой строки. При загрузке объекта "обратно" ссылка не восстанавливается - здесь ссылочная целостность на уровне ярлыка на рабочем столе, а не неотъемлемая часть объекта. |
|||
64
МишельЛагранж
19.02.14
✎
13:37
|
+ при выгрузках-загрузках через внешние файлы в разных базах на "один и тот же объект" будут разные ссылки.
|
|||
65
alexei366
19.02.14
✎
23:43
|
(63) (64) Смотри. Вариант 1:
Объект уже есть в базе, при десериализации его xml ссылка не обнулется. Вариант 2: объект записывается в базу паралельно, при десериализации его xml ссылка обнуляется |
|||
66
alexei366
20.02.14
✎
10:28
|
Народ, кто чо посоветует по поводу (65)
|
|||
67
hhhh
20.02.14
✎
10:50
|
(66) а эта строчка 1539baf3-9872-11e3-ad9a-005056b26ee0 откуда взялась?
|
|||
68
МишельЛагранж
20.02.14
✎
11:30
|
(65) разные базы - новые объекты для базы - новые ссылки.
Даже если в источнике объект имел супер-пупер офигенную ссылку, в новой базе новый объект получает другую. |
|||
69
alexei366
20.02.14
✎
17:56
|
(67) (68) Расскзываю: есть подписка ПриЗаписи моего дока, в этой подписке я сериализую Объект, и его сериализованную строку направляю в фоновое задание, где уже происходит обратная сериализация. Ссылка не востонавливается только если это новый объект.
1) Не передаю в фоновое сразу объект а его xml потомучто при передачи объекта фоновое получает Неопределенно. 2) Мне нужен именно данные тек объета , так как выполняется в фоне определенная (не секундная) обработка, и для неё нужны пермоментные данные (попрошу не обсуждать этот пункт, так надо). |
|||
70
alexei366
20.02.14
✎
17:57
|
(67) Да и какты понимаешь эта строчка являетс новой ссылкой для нового объекта.
|
|||
71
SUA
20.02.14
✎
18:09
|
(69) в подписке при записи объект и соответственно ссылка уже есть, нэ?
хотя с другой стороны транзакция записи еще вполне себе не завершена и поэтому для фонового задания объекта нет а можно записать и уже потом как-нибудь фоновым заданием все записанные обрабатывать отложенно? |
|||
72
Torquader
20.02.14
✎
20:31
|
А только мне одному кажется что <Ref>...</Ref> стандартно в объект не переводится ?
|
|||
73
alexei366
20.02.14
✎
22:04
|
(71) В xml она всегда есть, я в (69) уже объснял когда востанавливается, когда нет, но она есть всегда
|
|||
74
alexei366
20.02.14
✎
22:04
|
(72) Ты про что вообще?
|
|||
75
Torquader
20.02.14
✎
22:11
|
(73) Я к тому, что если сериализатор один, а десериализатор - другой, то может получиться совсем не то, что ожидали.
|
|||
76
alexei366
21.02.14
✎
03:41
|
(75) "понял чо сказал") все основывается на глобальном сериализаторе.
Он один! |
|||
77
МишельЛагранж
21.02.14
✎
08:31
|
(76) ты про 1с так не говори... у 1с свое понимание мира...
|
|||
78
alexei366
21.02.14
✎
11:33
|
(75) читай 69, там написано, и сериализатор 1!
|
|||
79
alexei366
21.02.14
✎
11:36
|
(77) Ты мне объяснить сможешь почему так происходит и как можно это обойти?
|
|||
80
МишельЛ
21.02.14
✎
14:07
|
(79) а ты можешь открыть нам механизмы 1С? нет? вот и мы не можем сказать, почему так.
Обойти - сохрани ссылку отдельно, если в этой же базе - присвой заново десериализованному объекту. |
|||
81
alexei366
21.02.14
✎
20:53
|
(80) я и спрашиваю, что не знаю механизма в данной области, надеясь что мне знающий ответит.
Я конеш не пробывал ещё, но у меня предчуствие что если я установлю ссылку десериализованному объекту то возникнет кнфликт или в фоновом или в основном. |
|||
82
hhhh
22.02.14
✎
00:31
|
(81) Так он и возник, конфликт.
|
|||
83
alexei366
22.02.14
✎
00:54
|
(82) Так как мне это обойти?
|
|||
84
alexei366
24.02.14
✎
11:09
|
Народ, у кого какие идеи?
|
|||
85
qeos
24.02.14
✎
11:13
|
Перейти ~Ошибка;
жескач то какой |
|||
86
alexei366
24.02.14
✎
12:16
|
(85) Вопрос не в этом
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |