Получить независимый черновик копированием именно ссылки узла

Учебные задачи

Ссылка.Скопировать возвращает новый объект, не новую сохранённую ссылку. Его имя и собственный учебный адрес изменяются в памяти, источник остаётся прежним.

Где и как запускать

Полный серверный модуль своей новой пустой Учебная85, платформа 8.5.1.1343. Только собственный периферийный узел, никакого настоящего обмена; здесь не запускался.

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу. В Конфигураторе имя корня Учебная85; не используйте рабочую базу или копию действующего обмена.

  2. В отдельной пустой конфигурации Учебная85 создайте Планы обмена → УчебныйОбмен: длина кода 9, тип Строка, наименование длиной 100. Распределённая информационная база выключена; состав плана пустой.

  3. Добавьте реквизит АдресУчебногоУзла: Строка длиной 100, Проверка заполнения = Показывать ошибку. Модуль объекта и подписки должны быть пустыми; не добавляйте отправку сообщений или внешние действия.

  4. Добавьте макет УчебнаяПамятка типа Текстовый документ, одна строка: Этот узел используется только для учебных примеров. История данных для плана не включена. Обновите конфигурацию базы данных.

  5. В своём УчебныйОбмен включите автонумерацию и контроль уникальности кода. РИБ выключена, состав пустой, расширений/подписок нет, модули пустые. Никаких HTTP/почтовых обработчиков или регистрации чужих изменений не добавляйте.

  6. Уроки здесь не запускались в 1С. В ваших базах не создавались узлы, не отправлялись и не принимались сообщения; HTML показывает только код и объяснение.

  7. ДатаОбмена по установленной справке означает дату последнего обмена с мобильным клиентом с автономным режимом. Её нельзя объявлять временем любой синхронизации или сетевым тестом.

  8. ВерсияДанных — непрозрачная строка платформы, не номер принятого сообщения. Все свойства ссылки readonly; изменения выполняются только у своего объекта.

  9. Создайте серверный общий модуль УчебныеСсылкиОбмена и вставьте весь модуль отдельного урока. ВыполнитьПример() Экспорт вызывайте из собственной процедуры формы с &НаСервереБезКонтекста.

  10. Транзакционные уроки временно записывают только свой новый периферийный узел и всегда откатывают запись. Не заменяйте ОтменитьТранзакцию фиксацией; внутри чужой транзакции модуль не допускается.

Процедура ВыполнитьПример() Экспорт
    Если Метаданные.ПланыОбмена.Найти("УчебныйОбмен") = Неопределено Тогда
        ВызватьИсключение "Сначала создайте собственный учебный план обмена";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Не запускайте урок внутри чужой транзакции";
    КонецЕсли;
    СвояСсылка = ПланыОбмена.УчебныйОбмен.ПолучитьСсылку(Новый УникальныйИдентификатор);
    Если СвояСсылка.ПолучитьОбъект() <> Неопределено Тогда
        ВызватьИсключение "Свой UUID уже используется, нужно новое значение";
    КонецЕсли;
    НачатьТранзакцию();
    Попытка
        Узел = ПланыОбмена.УчебныйОбмен.СоздатьУзел();
        Если Узел.ЭтотУзел Тогда
            ВызватьИсключение "Нельзя использовать текущий узел базы";
        КонецЕсли;
        Узел.УстановитьСсылкуНового(СвояСсылка);
        Узел.УстановитьНовыйКод("У");
        Узел.Наименование = "Свой временный учебный узел";
        Узел.АдресУчебногоУзла = "example.invalid";
        Узел.Наименование = "Источник собственной копии узла";
        Узел.Записать();
        СсылкаИсточника = Узел.Ссылка;
        Если СсылкаИсточника.ЭтотУзел Тогда
            ВызватьИсключение "Ссылка источника не должна указывать на текущий узел";
        КонецЕсли;
        Копия = СсылкаИсточника.Скопировать();
        Если Копия.ЭтотУзел Тогда
            ВызватьИсключение "Копия должна быть собственным периферийным черновиком";
        КонецЕсли;
        Копия.Наименование = "Независимый черновик копии";
        Копия.АдресУчебногоУзла = "copy.example.invalid";
        Сообщить(ТипЗнч(Копия) = Тип("ПланОбменаОбъект.УчебныйОбмен"));
        Сообщить(Копия.ЭтоНовый());
        Сообщить(Копия.Ссылка.Пустая());
        Сообщить(СсылкаИсточника.Наименование = "Источник собственной копии узла");
        Исходный = СсылкаИсточника.ПолучитьОбъект();
        Если Исходный = Неопределено Тогда
            ВызватьИсключение "Свой источник внутри транзакции отсутствует";
        КонецЕсли;
        Сообщить(Исходный.АдресУчебногоУзла = "example.invalid");
        Сообщить("Копия не записана; оба адреса — учебные строки, соединения не создавались");
        ОтменитьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    Сообщить(Не ТранзакцияАктивна());
    Сообщить(СвояСсылка.ПолучитьОбъект() = Неопределено);
КонецПроцедуры

Разбор по шагам

  1. Создать свой периферийный источник с новым UUID внутри новой отменяемой транзакции.

  2. Временно записать источник и получить именно его ссылку; ещё раз исключить текущий узел.

  3. Вызвать Скопировать на ссылке, проверить периферийность возвращённого объекта.

  4. Изменить только копию в памяти, проверить тип объекта, ЭтоНовый и пустоту её ссылки.

  5. Повторно получить исходный объект и проверить прежнее имя/адрес; не обращаться к выдуманным сетевым методам адреса.

  6. Не записывать копию. Откатить источник и проверить отсутствие своей исходной записи.

Как проверить результат

  1. Пять сравнений независимой копии Истина и проверки отката.

  2. Копия остаётся новым незаписанным объектом с пустой ссылкой.

  3. Источник не изменён копией, и после отката в базе не остаётся собственный источник.

Ожидаемый результат

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

На что обратить внимание

  1. Новый UUID и непустая ссылка не подтверждают существование узла; отдельно проверяется ПолучитьОбъект.

  2. Нулевые счётчики и дата не доказывают успешный обмен. Этот блок не формирует/не читает сообщения и не открывает соединения.

  3. Не присваивайте свойствам ссылки и не устанавливайте ЭтотУзел=Истина для имитации текущей базы.

  4. Откат базы не отменяет внешние действия обработчиков, поэтому урок допускается только в своей пустой конфигурации с пустыми модулями и подписками.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.