Теряется ссылка после записи десериализационного объекта

1. terrorion 92 11.08.20 17:50 Сейчас в теме +1 $m
Добрый день!
После записи десериализованного объекта справочника теряется ссылка. Один такой справочник попался из многих, отличается только тем, что у него два владельца. В чем может быть проблема?
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. bayce 45 11.08.20 20:56 Сейчас в теме
владельцы тоже переносятся или перенос без них? если без них то и их надо переносить.
5. terrorion 92 12.08.20 06:55 Сейчас в теме
(2) Владельцы переносятся, при этом у элемента в целевой базе владелец после записи определен, но не определена его собственная ссылка. В первый раз при десериализации получаю таблицу значений из источника, в которых есть ссылки вида "Объект не найден ..." типа данного справочника.

https://yadi.sk/i/XtAZYxaI3jKxGQ

Затем после записи Элемента в целевой базе ссылка пропадает

https://yadi.sk/i/03Qdzm45IkccDQ

и ее нет у справочника, хотя объект присутствует и я его могу выбрать, но ссылка пустая.

После при загрузке объектов ссылки в таблице значений из источника уже пустые, как будто они как-то определены в целевой базе, как пустые. Если я удалю все загруженные элементы и заново сделаю обмен, в таблице значений из источника вновь появятся ссылки "Объект не найден...", пока не запишу элементы в целевой базе.
9. gmw 12.08.20 07:53 Сейчас в теме
(5)
В первый раз при десериализации получаю таблицу значений из источника, в которых есть ссылки вида "Объект не найден ..." типа данного справочника.
...
Затем после записи Элемента в целевой базе ссылка пропадает
...
и ее нет у справочника, хотя объект присутствует и я его могу выбрать, но ссылка пустая.


Вы говорите о таблице значений, изменяются её записи, а не записи базы?
Получается, что проблема возникает при изменении таблицы значений и состоит в том, что значение поля таблицы значений перестало соответствовать ссылке объекта. Нужно найти место, где происходит перезапись строки таблицы значений.
12. terrorion 92 12.08.20 08:21 Сейчас в теме
(9) Перезаписи таблицы значений нет. При записи именно элемента пропадает ссылка в таблице значений.

Общая схема такая:
Элемент = Справочники[ИмяМетаданных].СоздатьЭлемент();
Элемент.ОбменДанными.Загрузка = Истина;
Элемент.УстановитьСсылкуНового(СтрТаб.Ссылка);
ЗаполнитьЗначенияСвойств(Элемент, СтрТаб);
Элемент.Записать();


После последней строки пропадает ссылка в ТЗ, и в элементе ссылка не появляется. Этот фрагмент работает для всех справочников, но именно на данном такой непонятный момент.
14. gmw 12.08.20 08:44 Сейчас в теме
(12)
Перезаписи таблицы значений нет. При записи именно элемента пропадает ссылка в таблице значений.


Как может измениться значение переменной без изменения переменной?
Могу объяснить только так: изменилось лишь отображение значения переменной, которое мы видим. Нужно обновить это отображение.
Или же всё-таки перезапись происходит внутренним механизмом, который нам недоступен.
15. terrorion 92 12.08.20 08:50 Сейчас в теме
(14) Переменная содержит ссылку, которую я назначаю объекту базы. После записи ссылка в ТЗ и в объекте базы становится идентичной, и по-видимому, она имеет какое-то значение, ведь объекты создаются, просто не имеет отображения.
16. gmw 12.08.20 08:55 Сейчас в теме
(15)Сообщить(СокрЛП(Элемент.Ссылка))
23. gmw 12.08.20 09:45 Сейчас в теме
(20) Включить замер производительности и посмотреть, куда передаётся управление.
СтрТаб.Ссылка реально очищается или в СтрТаб изменяется текущая строка (это вероятнее всего).
24. gmw 12.08.20 09:48 Сейчас в теме
(20) Покажите, пожалуйста, как происходит запись другого объекта, в котором всё хорошо.
25. gmw 12.08.20 09:57 Сейчас в теме
(20) Возможно, работает подписка на событие ПриЗаписи, её в тексте не видно. Замер производительности поможет отловить её.
26. terrorion 92 12.08.20 10:00 Сейчас в теме
27. gmw 12.08.20 10:09 Сейчас в теме
(26) СтрТаб.Ссылка реально изменилась при записи объекта.
В модуле объекта, ПередЗаписью, ПриЗаписи?
29. terrorion 92 12.08.20 10:29 Сейчас в теме
(27) Только метод "ПередЗаписью", но там ничего не происходит такого. НО все же специально закомментировал и проверил, то же самое.
18. gmw 12.08.20 09:07 Сейчас в теме
(15) Я бы ещё проверил права доступа.
19. terrorion 92 12.08.20 09:15 Сейчас в теме
17. bayce 45 12.08.20 09:05 Сейчас в теме
(5)Может данная ссылка с ГАЙДОМ уже существует в базе?
21. gmw 12.08.20 09:15 Сейчас в теме
(17) Очень может быть

"Синтаксис:
УстановитьСсылкуНового(<Ссылка>)
Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа. Уникальность ссылки проверяется при записи объекта."
22. terrorion 92 12.08.20 09:15 Сейчас в теме
(17) справочник изначально пустой
3. gmw 11.08.20 21:51 Сейчас в теме
У данного объекта 2 владельца, поэтому при переносе он записывается 2 раза, перед записью каждого владельца, причём из разных копий, которые были созданы при сериализации владельцев. При каждой операции записи десериализованному объекту присваивается новая ссылка, которая замещает предыдущую. Поэтому после записи Владельца 2 ссылка на объект у Владельца 1 устарела, она не может быть найдена. Эту ссылку нужно обновить значением ссылки на объект, взятым у Владельца 2.
4. tango 540 11.08.20 23:27 Сейчас в теме
(3) Сорри, это вы сейчас рассказали, как работает что-то из штатного переноса?
10. gmw 12.08.20 07:56 Сейчас в теме
11. gmw 12.08.20 08:19 Сейчас в теме
(4) Вы правы, это всего лишь моё понимание проблемы.
6. terrorion 92 12.08.20 07:10 Сейчас в теме
(3) У элемента владелец один (у справочника их два). При этом элементы другого владельца я не загружаю. По алгоритму сначала загружаются и записываются в целевую базу элементы владельца, а потом элементы подчиненного справочника. Владелец после записи корректно определен в элементе, но его собственной ссылки нет.

Ваш пост не совсем понял, можно пояснить на примере?
7. gmw 12.08.20 07:16 Сейчас в теме
8. gmw 12.08.20 07:35 Сейчас в теме
(6)
По алгоритму сначала загружаются и записываются в целевую базу элементы владельца, а потом элементы подчиненного справочника.

Быть может, проблема в порядке загрузки?
13. terrorion 92 12.08.20 08:24 Сейчас в теме
39. bayce 45 12.08.20 12:08 Сейчас в теме
(6)Надо другого владельца тоже загружать или находить. в приведенном выше коде ссылка на второй владелец не устанавливается, т.к. в таблице лежит ссылка на второго владельца из старой базы(в новой скорее всего другая ссылка ГАЙД).
30. terrorion 92 12.08.20 10:31 Сейчас в теме
Выход конечно есть, сделать по коду для данного справочника, но хочется понять причину проблемы.
31. gmw 12.08.20 11:25 Сейчас в теме
(30) Да, нужно разгадать эту головоломку.
1. Поставить точки останова в начале и в конце ПередЗаписью, посмотреть, что реально есть в объекте в поле Ссылка, изменяется ли оно.
2. СтрТаб - изменяется её индекс или она очищается?
3. Включить замер производительности перед Элемент.Записать(); и выключить после него, посмотреть, куда передавалось управление.
32. terrorion 92 12.08.20 11:29 Сейчас в теме
(31) Что интересно, при следующей загрузке СтрТаб.Ссылка выглядит пустой еще до записи, так как ей сопоставлен уже объект в базе. А вот если объект в базе удалю, при следующей загрузке СтрТаб.Ссылка опять не пустая.
33. gmw 12.08.20 11:29 Сейчас в теме
(30) Соответствует ли тип справочника-источника типу справочника-приёмника?
34. terrorion 92 12.08.20 11:30 Сейчас в теме
(33) Метаданные из источника я скопировал в приемник, чтобы структура была идентичной.
36. gmw 12.08.20 11:34 Сейчас в теме
(34) Структура идентична, но тип, возможно, теперь другой (GUID). Поэтому при записи, возможно, и возникает проблема.
35. terrorion 92 12.08.20 11:32 Сейчас в теме
(33) Вообще приемник это урезанная конфа для мобильного приложения, куда я переношу (копипаст между конфами) некоторые метаданные.
37. gmw 12.08.20 11:36 Сейчас в теме
(35) Лучше тогда ссылку не использовать, опираться на другие поля поиска.
38. gmw 12.08.20 11:46 Сейчас в теме
(30) Возможно, происходит следующее.
1. Элемент.УстановитьСсылкуНового(СтрТаб.Ссылка); - ссылка установлена, но она другого типа, так как тип источника не соответствует типу приёмника.
2. После записи объект в базе есть, но его не видно в СтрТаб.Ссылка, так как это поле имеет тип базы-источника и не может отобразить значение типа базы-приёмника.
3. Поэтому СтрТаб не изменилась, но отобразить результат после записи она не может.
40. terrorion 92 12.08.20 13:40 Сейчас в теме
В общем проблема была глупая. Я меняю представление ссылки в модуле менеджера, а поле для этого представления я не передавал. Всем спасибо за участие!
41. gmw 15.08.20 20:40 Сейчас в теме
(40) Моё представление об участии в платном форуме тоже изменилось.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот