Добрый день!
После записи десериализованного объекта справочника теряется ссылка. Один такой справочник попался из многих, отличается только тем, что у него два владельца. В чем может быть проблема?
(2) Владельцы переносятся, при этом у элемента в целевой базе владелец после записи определен, но не определена его собственная ссылка. В первый раз при десериализации получаю таблицу значений из источника, в которых есть ссылки вида "Объект не найден ..." типа данного справочника.
и ее нет у справочника, хотя объект присутствует и я его могу выбрать, но ссылка пустая.
После при загрузке объектов ссылки в таблице значений из источника уже пустые, как будто они как-то определены в целевой базе, как пустые. Если я удалю все загруженные элементы и заново сделаю обмен, в таблице значений из источника вновь появятся ссылки "Объект не найден...", пока не запишу элементы в целевой базе.
В первый раз при десериализации получаю таблицу значений из источника, в которых есть ссылки вида "Объект не найден ..." типа данного справочника.
...
Затем после записи Элемента в целевой базе ссылка пропадает
...
и ее нет у справочника, хотя объект присутствует и я его могу выбрать, но ссылка пустая.
Вы говорите о таблице значений, изменяются её записи, а не записи базы?
Получается, что проблема возникает при изменении таблицы значений и состоит в том, что значение поля таблицы значений перестало соответствовать ссылке объекта. Нужно найти место, где происходит перезапись строки таблицы значений.
(9) Перезаписи таблицы значений нет. При записи именно элемента пропадает ссылка в таблице значений.
Общая схема такая:
Элемент = Справочники[ИмяМетаданных].СоздатьЭлемент();
Элемент.ОбменДанными.Загрузка = Истина;
Элемент.УстановитьСсылкуНового(СтрТаб.Ссылка);
ЗаполнитьЗначенияСвойств(Элемент, СтрТаб);
Элемент.Записать();
После последней строки пропадает ссылка в ТЗ, и в элементе ссылка не появляется. Этот фрагмент работает для всех справочников, но именно на данном такой непонятный момент.
Перезаписи таблицы значений нет. При записи именно элемента пропадает ссылка в таблице значений.
Как может измениться значение переменной без изменения переменной?
Могу объяснить только так: изменилось лишь отображение значения переменной, которое мы видим. Нужно обновить это отображение.
Или же всё-таки перезапись происходит внутренним механизмом, который нам недоступен.
(14) Переменная содержит ссылку, которую я назначаю объекту базы. После записи ссылка в ТЗ и в объекте базы становится идентичной, и по-видимому, она имеет какое-то значение, ведь объекты создаются, просто не имеет отображения.
"Синтаксис:
УстановитьСсылкуНового(<Ссылка>)
Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа. Уникальность ссылки проверяется при записи объекта."
У данного объекта 2 владельца, поэтому при переносе он записывается 2 раза, перед записью каждого владельца, причём из разных копий, которые были созданы при сериализации владельцев. При каждой операции записи десериализованному объекту присваивается новая ссылка, которая замещает предыдущую. Поэтому после записи Владельца 2 ссылка на объект у Владельца 1 устарела, она не может быть найдена. Эту ссылку нужно обновить значением ссылки на объект, взятым у Владельца 2.
(3) У элемента владелец один (у справочника их два). При этом элементы другого владельца я не загружаю. По алгоритму сначала загружаются и записываются в целевую базу элементы владельца, а потом элементы подчиненного справочника. Владелец после записи корректно определен в элементе, но его собственной ссылки нет.
Ваш пост не совсем понял, можно пояснить на примере?
(6)Надо другого владельца тоже загружать или находить. в приведенном выше коде ссылка на второй владелец не устанавливается, т.к. в таблице лежит ссылка на второго владельца из старой базы(в новой скорее всего другая ссылка ГАЙД).
(30) Да, нужно разгадать эту головоломку.
1. Поставить точки останова в начале и в конце ПередЗаписью, посмотреть, что реально есть в объекте в поле Ссылка, изменяется ли оно.
2. СтрТаб - изменяется её индекс или она очищается?
3. Включить замер производительности перед Элемент.Записать(); и выключить после него, посмотреть, куда передавалось управление.
(31) Что интересно, при следующей загрузке СтрТаб.Ссылка выглядит пустой еще до записи, так как ей сопоставлен уже объект в базе. А вот если объект в базе удалю, при следующей загрузке СтрТаб.Ссылка опять не пустая.
(30) Возможно, происходит следующее.
1. Элемент.УстановитьСсылкуНового(СтрТаб.Ссылка); - ссылка установлена, но она другого типа, так как тип источника не соответствует типу приёмника.
2. После записи объект в базе есть, но его не видно в СтрТаб.Ссылка, так как это поле имеет тип базы-источника и не может отобразить значение типа базы-приёмника.
3. Поэтому СтрТаб не изменилась, но отобразить результат после записи она не может.