Имя: Пароль:
1C
1С v8
Сериализация объекта
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) Вопрос не в этом
Ошибка? Это не ошибка, это системная функция.