Ссылка на собственную реально записанную запись: метаданные, дата/номер/версия/состояние, незаписанная копия и проверка неизменности оригинала; собственная транзакция откатывается.
Где и как запускать
Полный серверный общий модуль УчебныйЦикл85, собственный пустой стенд УчебныеСсылкиМаршрута85; отдельный управляемый клиентский модуль вызова.
Подготовка
Новая пустая конфигурация УчебныеСсылкиМаршрута85 на платформе8.5.1.1343, управляемое приложение и толстый клиент Windows. Рабочие УТ/КА/УНФ/БП и чужие ссылки не используются.
Задачи → УчебнаяЗадача85: номер Строка9 с автонумерацией, Наименование100. Бизнес-процессы → УчебныйПроцесс85: номер Строка9 с автонумерацией, Задача=УчебнаяЗадача85.
У обоих видов реквизиты Маркер85 Строка36 и Текст85 Строка100, без обязательного заполнения. Код сам создаёт свой маркер и содержимое, не спрашивает неизвестный ИсходныйОбъект.
Карта процесса Старт → одиночное действие Опыт85 → Финиш, без адресации, вложенных/групповых точек и обработчиков. Процесс здесь не стартует, задача отдельная, без связи с маршрутом.
Модули объектов, менеджеров и точки пустые; нет ПриКопировании, ПередЗаписью, подписок, истории, обмена или произвольных внешних действий.
Общие → Общие модули → УчебныйЦикл85: Сервер и ВызовСервера Истина, Глобальный/Привилегированный Ложь; остальные флаги и повторное использование выключены. Вставьте основной код одного урока полностью.
Обработки → Запуск85 → управляемая форма Форма: ПодтверждаюПустойСтенд85 и Занято85 Булево исходно Ложь; Итог85 Строка неограниченной длины только для просмотра.
Вставьте дополнительный полный модуль формы; команда ВыполнитьПример85 назначена кнопке, Действие=ВыполнитьСвойЦикл85. Клиентская процедура ВыполнитьСвойЦикл85 передаёт согласие в УчебныйЦикл85.ВыполнитьПример85.
F7 и обновление только своего стенда. runtimeVerifiedScenarios=0: 1С, запись/чтение/копирование/откат здесь реально не выполнялись.
Исследуемый вид должен быть пуст. Код выбирает собственную незанятую плановую ссылку, пишет один реальный объект внутри своей транзакции и повторно получает его через ссылку.
Будущий ручной опыт после согласия читает все поля собственного паспорта, создаёт новую копию через Скопировать, меняет только её пользовательские реквизиты и проверяет оригинал.
Копия не записывается, не получает произвольно заданный номер, не выполняется и не стартует. После проверки единственной записи оригинал откатывается; итог клиенту только текстовый.
Не добавляйте ФиксироватьТранзакцию, открытие модальных форм или чужие ссылки. Этот опыт не сохраняет объект для следующего урока и не удаляет произвольные записи.
Функция ВыполнитьПример85(Согласие) Экспорт
Если Не Согласие Тогда
ВызватьИсключение "Только собственный новый пустой стенд УчебныеСсылкиМаршрута85 с согласием";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Нужна платформа8.5.1.1343; чужая транзакция недопустима";
КонецЕсли;
ВыборкаДо = Задачи.УчебнаяЗадача85.Выбрать();
Если ВыборкаДо.Следующий() Тогда
ВызватьИсключение "Исследуемый собственный вид должен быть пустым";
КонецЕсли;
Маркер = Строка(Новый УникальныйИдентификатор);
Ссылка = Задачи.УчебнаяЗадача85.ПолучитьСсылку(Новый УникальныйИдентификатор);
Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
ВызватьИсключение "Собственная плановая ссылка уже занята";
КонецЕсли;
НачатьТранзакцию();
Попытка
Оригинал = Задачи.УчебнаяЗадача85.СоздатьЗадачу();
Оригинал.УстановитьСсылкуНового(Ссылка);
Оригинал.Дата = Дата(2026, 10, 9, 10, 0, 0);
Оригинал.Маркер85 = Маркер;
Оригинал.Текст85 = "Оригинал для копирования";
Оригинал.Наименование = "Паспорт собственной задачи " + Маркер;
Оригинал.Записать();
Прочитанный = Ссылка.ПолучитьОбъект();
Если Прочитанный = Неопределено Тогда
ВызватьИсключение "Своя запись должна действительно существовать внутри транзакции";
КонецЕсли;
Если ТипЗнч(Прочитанный) <> Тип("ЗадачаОбъект.УчебнаяЗадача85")
Или Прочитанный.Маркер85 <> Маркер Или Прочитанный.Текст85 <> "Оригинал для копирования" Тогда
ВызватьИсключение "Ссылка не ведёт к ожидаемому собственному сохранённому объекту";
КонецЕсли;
ОписаниеВида = Ссылка.Метаданные();
Если ОписаниеВида <> Метаданные.Задачи.УчебнаяЗадача85 Тогда
ВызватьИсключение "Метаданные ссылки не соответствуют собственному виду";
КонецЕсли;
Паспорт = Новый Структура;
Паспорт.Вставить("БизнесПроцесс", Ссылка.БизнесПроцесс);
Паспорт.Вставить("ВерсияДанных", Ссылка.ВерсияДанных);
Паспорт.Вставить("Выполнена", Ссылка.Выполнена);
Паспорт.Вставить("Дата", Ссылка.Дата);
Паспорт.Вставить("Наименование", Ссылка.Наименование);
Паспорт.Вставить("Номер", Ссылка.Номер);
Паспорт.Вставить("ПометкаУдаления", Ссылка.ПометкаУдаления);
Паспорт.Вставить("Ссылка", Ссылка.Ссылка);
Паспорт.Вставить("ТочкаМаршрута", Ссылка.ТочкаМаршрута);
Если Паспорт.Ссылка <> Ссылка Или Паспорт.Дата <> Оригинал.Дата Тогда
ВызватьИсключение "Идентичность или дата прочитанного паспорта не совпали с собственной записью";
КонецЕсли;
Если ТипЗнч(Паспорт.Номер) <> Тип("Строка") Тогда
ВызватьИсключение "Собственные метаданные требуют строковый номер";
КонецЕсли;
Если Паспорт.Номер = "" Или Паспорт.Номер <> Оригинал.Номер Или Паспорт.ПометкаУдаления Тогда
ВызватьИсключение "Реальный номер не совпал или собственная запись помечена на удаление";
КонецЕсли;
Если ТипЗнч(Паспорт.ВерсияДанных) <> Тип("Строка") Тогда
ВызватьИсключение "Версия данных должна быть непрозрачной строкой";
КонецЕсли;
Если Паспорт.ВерсияДанных <> Прочитанный.ВерсияДанных Тогда
ВызватьИсключение "Версия ссылки не совпала с повторно прочитанным собственным объектом";
КонецЕсли;
Если Паспорт.Наименование <> Оригинал.Наименование Или Паспорт.Выполнена Тогда
ВызватьИсключение "Имя своей задачи не совпало или задача неожиданно выполнена";
КонецЕсли;
Если Паспорт.БизнесПроцесс <> БизнесПроцессы.УчебныйПроцесс85.ПустаяСсылка()
Или Паспорт.ТочкаМаршрута <> БизнесПроцессы.УчебныйПроцесс85.ПустаяСсылкаНаТочкуМаршрута() Тогда
ВызватьИсключение "Отдельная учебная задача не должна принадлежать чужому маршруту";
КонецЕсли;
Копия = Ссылка.Скопировать();
Если ТипЗнч(Копия) <> Тип("ЗадачаОбъект.УчебнаяЗадача85") Тогда
ВызватьИсключение "Скопировать должно вернуть новый объект своего вида, не ссылку";
КонецЕсли;
Если Не Копия.ЭтоНовый() Или Копия.Выполнена Тогда
ВызватьИсключение "Копия должна быть новым неисполненным объектом в памяти";
КонецЕсли;
Если Копия.Маркер85 <> Маркер Или Копия.Текст85 <> Прочитанный.Текст85 Тогда
ВызватьИсключение "Собственные реквизиты не были перенесены в новую копию";
КонецЕсли;
Копия.Маркер85 = Строка(Новый УникальныйИдентификатор);
Копия.Текст85 = "Изменена только копия в памяти";
Если Копия.Маркер85 = Маркер Или Копия.Текст85 = Прочитанный.Текст85 Тогда
ВызватьИсключение "Новую копию не удалось отличить от оригинала";
КонецЕсли;
ПроверкаОригинала = Ссылка.ПолучитьОбъект();
Если ПроверкаОригинала = Неопределено Тогда
ВызватьИсключение "Свой оригинал исчез до отката";
КонецЕсли;
Если ПроверкаОригинала.Маркер85 <> Маркер Или ПроверкаОригинала.Текст85 <> "Оригинал для копирования" Тогда
ВызватьИсключение "Изменение незаписанной копии затронуло собственный оригинал";
КонецЕсли;
ВыборкаПослеКопирования = Задачи.УчебнаяЗадача85.Выбрать();
КоличествоЗаписей = 0;
Пока ВыборкаПослеКопирования.Следующий() Цикл
КоличествоЗаписей = КоличествоЗаписей + 1;
Если ВыборкаПослеКопирования.Ссылка <> Ссылка Или ВыборкаПослеКопирования.Маркер85 <> Маркер Тогда
ВызватьИсключение "Копирование создало лишнюю запись или чужой результат";
КонецЕсли;
КонецЦикла;
Если КоличествоЗаписей <> 1 Тогда
ВызватьИсключение "В базе должен быть только свой оригинал, не копия";
КонецЕсли;
Итог = "Прочитан реальный паспорт " + ОписаниеВида.Имя + ": номер " + Паспорт.Номер
+ ", дата " + Строка(Паспорт.Дата) + ", версия " + Паспорт.ВерсияДанных
+ ". Новая копия изменена только в памяти; оригинал не изменён.";
ОтменитьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если ТранзакцияАктивна() Или Ссылка.ПолучитьОбъект() <> Неопределено Тогда
ВызватьИсключение "Собственный оригинал остался после отката";
КонецЕсли;
Возврат Итог + " Собственная запись отменена; ссылки из опыта не обозначают сохранённые объекты.";
КонецФункцииУправляемый запуск УчебнаяЗадача85
УчебныеСсылкиМаршрута85 → Обработки → Запуск85 → Формы → Форма → Модуль
Полный модуль собственной управляемой формы: согласие, занятость и серверный вызов УчебныйЦикл85.ВыполнитьПример85.
&НаКлиенте
Процедура ВыполнитьСвойЦикл85(Команда)
Если Не ПодтверждаюПустойСтенд85 Или Занято85 Тогда
ВызватьИсключение "Нужно собственное подтверждение и отсутствие другого опыта";
КонецЕсли;
Занято85 = Истина;
Попытка
Итог85 = УчебныйЦикл85.ВыполнитьПример85(ПодтверждаюПустойСтенд85);
Исключение
Занято85 = Ложь;
Итог85 = ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
Занято85 = Ложь;
КонецПроцедурыРазбор по шагам
Проверяются собственный стенд, согласие, версия, отсутствие чужой транзакции и пустой исследуемый вид. Плановая ссылка до записи не обозначает существующий объект.
Настоящий менеджер создаёт объект, собственная ссылка назначается до первой записи; дата, маркер и текст заданы явно. Строковый номер реально присваивается автонумерацией.
После записи ПолучитьОбъект возвращает настоящий объект своего вида с ожидаемыми пользовательскими данными. Метаданные ссылки сравниваются с точным собственным метаданным видом.
В отдельный паспорт читаются readonly-поля ссылки. Дата/номер/Ссылка сравниваются со своей записью, версия — с повторно прочитанным объектом; формат непрозрачной версии не угадывается.
Имя задачи должно совпадать; Выполнена и ПометкаУдаления ложные. БизнесПроцесс и ТочкаМаршрута пустые значения собственных ссылочных типов, не фиктивные точки.
Скопировать вызывается на ссылке реально существующего оригинала. Результат проверяется как новый объект своего вида, а не как сохранённая ссылка или произвольная структура.
У копии проверяется перенос пользовательских реквизитов, затем её маркер и текст меняются в памяти. Повторное чтение оригинала доказывает, что эти изменения не записались в оригинал.
Выборка подтверждает только одну собственную запись в базе, не появление копии. Успех и ошибка оба приводят к откату собственной транзакции.
После отката ПолучитьОбъект по прежней ссылке возвращает Неопределено. Клиент получает текст результата, не несуществующую ссылку для рабочего интерфейса.
Как проверить результат
Ссылка после своей записи действительно получает объект своего вида с собственным маркером и текстом.
Метаданные совпадают с точным собственным видом; паспорт содержит реальные readonly-дата/номер/версия/идентичность и исходное состояние.
У задачи прочитаны реальные имя, Выполнена, пустые БизнесПроцесс/ТочкаМаршрута и ПометкаУдаления без присваиваний ссылке.
Скопировать возвращает новый объект, его пользовательские реквизиты перенесены и затем изменены только в памяти.
Повторно прочитанный оригинал сохранил исходные маркер и текст; в базе осталась одна собственная запись до отката.
После отката нет собственного оригинала и активной транзакции. В базе не создана копия; нет старта, выполнения, удаления или файла.
Ожидаемый результат
При будущем ручном запуске получен проверенный паспорт своей сохранённой записи, изменена независимая новая копия в памяти и отменена собственная запись оригинала.
На что обратить внимание
Ссылка — идентичность записи, объект — редактируемый экземпляр в памяти. Скопировать на ссылке возвращает новый объект, а не вторую ссылку и не сохраняет его.
Все перечисленные свойства задачи/процесса на ссылке readonly, даже если одноимённое свойство объекта допускает запись. Не меняйте Ссылка.Дата/Номер/ПометкаУдаления/состояние присваиванием.
Номер ссылки может быть числом или строкой в другом метаданном виде. Только наш собственный стенд задаёт Строка9, поэтому код проверяет этот тип, не предполагает его универсальным.
ВерсияДанных — непрозрачная строка версии, не дата, порядковый номер, UUID или доказательство выполнения процесса. Здесь читается и сравнивается фактическое значение, без разбора формата.
Ссылка.Ссылка указывает на ту же запись. Это не новый объект и не новая запись; сравнение проверяет идентичность собственного паспорта.
Пустые БизнесПроцесс/ТочкаМаршрута у отдельной задачи допустимы. Пустая точка не означает точку Старт и не даёт право имитировать выполнение задачи.
ВедущаяЗадача относится к вложенному процессу и может автоматически выполняться при его завершении. У собственного невложенного оригинала она пустая; рабочую ведущую задачу сюда не подставляют.
Чтение Стартован/Завершен/Выполнена не запускает workflow. Код не присваивает readonly-флаги, не вызывает Старт, выполнение или пометку удаления.
Копирование может вызвать собственный ПриКопировании. Пустые модули стенда важны: произвольный рабочий обработчик способен изменить перенос реквизитов или сделать внешнее действие.
Код не предполагает, что новая копия наследует номер, версию или готовую бизнес-идентичность оригинала. Проверены пользовательские реквизиты и новый объект, копия не записывается.
После отката обе структуры паспорта и любые значения ссылок — лишь данные завершённого опыта. Прежняя ссылка больше не обозначает существующую запись; клиенту возвращается только текст.
Откат собственной транзакции не отменяет произвольную сеть/печать/обмен из стороннего обработчика. Поэтому нужен новый стенд с пустыми модулями, не рабочая база.
На реальных больших данных чтение множества свойств через ссылки может обращаться к серверу/базе. Здесь один собственный объект; для массового отчёта используйте запрос с нужными полями.
Все проверки в этом сеансе статические, runtimeVerifiedScenarios=0. Реальные действия1С, файлы, сеть, архивы и новые резервные копии не выполнялись.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.