Ссылка.Скопировать возвращает новый объект, не новую сохранённую ссылку. Его имя и собственный учебный адрес изменяются в памяти, источник остаётся прежним.
Где и как запускать
Полный серверный модуль своей новой пустой Учебная85, платформа 8.5.1.1343. Только собственный периферийный узел, никакого настоящего обмена; здесь не запускался.
Подготовка
Создайте НОВУЮ пустую файловую учебную базу. В Конфигураторе имя корня Учебная85; не используйте рабочую базу или копию действующего обмена.
В отдельной пустой конфигурации Учебная85 создайте Планы обмена → УчебныйОбмен: длина кода 9, тип Строка, наименование длиной 100. Распределённая информационная база выключена; состав плана пустой.
Добавьте реквизит АдресУчебногоУзла: Строка длиной 100, Проверка заполнения = Показывать ошибку. Модуль объекта и подписки должны быть пустыми; не добавляйте отправку сообщений или внешние действия.
Добавьте макет УчебнаяПамятка типа Текстовый документ, одна строка: Этот узел используется только для учебных примеров. История данных для плана не включена. Обновите конфигурацию базы данных.
В своём УчебныйОбмен включите автонумерацию и контроль уникальности кода. РИБ выключена, состав пустой, расширений/подписок нет, модули пустые. Никаких HTTP/почтовых обработчиков или регистрации чужих изменений не добавляйте.
Уроки здесь не запускались в 1С. В ваших базах не создавались узлы, не отправлялись и не принимались сообщения; HTML показывает только код и объяснение.
ДатаОбмена по установленной справке означает дату последнего обмена с мобильным клиентом с автономным режимом. Её нельзя объявлять временем любой синхронизации или сетевым тестом.
ВерсияДанных — непрозрачная строка платформы, не номер принятого сообщения. Все свойства ссылки readonly; изменения выполняются только у своего объекта.
Создайте серверный общий модуль УчебныеСсылкиОбмена и вставьте весь модуль отдельного урока. ВыполнитьПример() Экспорт вызывайте из собственной процедуры формы с &НаСервереБезКонтекста.
Транзакционные уроки временно записывают только свой новый периферийный узел и всегда откатывают запись. Не заменяйте ОтменитьТранзакцию фиксацией; внутри чужой транзакции модуль не допускается.
Процедура ВыполнитьПример() Экспорт
Если Метаданные.ПланыОбмена.Найти("УчебныйОбмен") = Неопределено Тогда
ВызватьИсключение "Сначала создайте собственный учебный план обмена";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Не запускайте урок внутри чужой транзакции";
КонецЕсли;
СвояСсылка = ПланыОбмена.УчебныйОбмен.ПолучитьСсылку(Новый УникальныйИдентификатор);
Если СвояСсылка.ПолучитьОбъект() <> Неопределено Тогда
ВызватьИсключение "Свой UUID уже используется, нужно новое значение";
КонецЕсли;
НачатьТранзакцию();
Попытка
Узел = ПланыОбмена.УчебныйОбмен.СоздатьУзел();
Если Узел.ЭтотУзел Тогда
ВызватьИсключение "Нельзя использовать текущий узел базы";
КонецЕсли;
Узел.УстановитьСсылкуНового(СвояСсылка);
Узел.УстановитьНовыйКод("У");
Узел.Наименование = "Свой временный учебный узел";
Узел.АдресУчебногоУзла = "example.invalid";
Узел.Наименование = "Источник собственной копии узла";
Узел.Записать();
СсылкаИсточника = Узел.Ссылка;
Если СсылкаИсточника.ЭтотУзел Тогда
ВызватьИсключение "Ссылка источника не должна указывать на текущий узел";
КонецЕсли;
Копия = СсылкаИсточника.Скопировать();
Если Копия.ЭтотУзел Тогда
ВызватьИсключение "Копия должна быть собственным периферийным черновиком";
КонецЕсли;
Копия.Наименование = "Независимый черновик копии";
Копия.АдресУчебногоУзла = "copy.example.invalid";
Сообщить(ТипЗнч(Копия) = Тип("ПланОбменаОбъект.УчебныйОбмен"));
Сообщить(Копия.ЭтоНовый());
Сообщить(Копия.Ссылка.Пустая());
Сообщить(СсылкаИсточника.Наименование = "Источник собственной копии узла");
Исходный = СсылкаИсточника.ПолучитьОбъект();
Если Исходный = Неопределено Тогда
ВызватьИсключение "Свой источник внутри транзакции отсутствует";
КонецЕсли;
Сообщить(Исходный.АдресУчебногоУзла = "example.invalid");
Сообщить("Копия не записана; оба адреса — учебные строки, соединения не создавались");
ОтменитьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Сообщить(Не ТранзакцияАктивна());
Сообщить(СвояСсылка.ПолучитьОбъект() = Неопределено);
КонецПроцедурыРазбор по шагам
Создать свой периферийный источник с новым UUID внутри новой отменяемой транзакции.
Временно записать источник и получить именно его ссылку; ещё раз исключить текущий узел.
Вызвать Скопировать на ссылке, проверить периферийность возвращённого объекта.
Изменить только копию в памяти, проверить тип объекта, ЭтоНовый и пустоту её ссылки.
Повторно получить исходный объект и проверить прежнее имя/адрес; не обращаться к выдуманным сетевым методам адреса.
Не записывать копию. Откатить источник и проверить отсутствие своей исходной записи.
Как проверить результат
Пять сравнений независимой копии Истина и проверки отката.
Копия остаётся новым незаписанным объектом с пустой ссылкой.
Источник не изменён копией, и после отката в базе не остаётся собственный источник.
Ожидаемый результат
Показан контракт копирования ссылки на собственных учебных данных без реального обмена.
На что обратить внимание
Новый UUID и непустая ссылка не подтверждают существование узла; отдельно проверяется ПолучитьОбъект.
Нулевые счётчики и дата не доказывают успешный обмен. Этот блок не формирует/не читает сообщения и не открывает соединения.
Не присваивайте свойствам ссылки и не устанавливайте ЭтотУзел=Истина для имитации текущей базы.
Откат базы не отменяет внешние действия обработчиков, поэтому урок допускается только в своей пустой конфигурации с пустыми модулями и подписками.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.