СправочникОбъект.<Имя справочника>.УстановитьСсылкуНового

Методы · SetNewObjectRef

Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа. Уникальность ссылки проверяется при записи объекта.

Синтаксис

УстановитьСсылкуНового(<Ссылка>)
Полное описание, параметры и ограничения

СправочникОбъект.<Имя справочника>.УстановитьСсылкуНового (CatalogObject.<Catalog name>.SetNewObjectRef)

СправочникОбъект.<Имя справочника> (CatalogObject.<Catalog name>)

УстановитьСсылкуНового (SetNewObjectRef)

Доступен, начиная с версии 8.0.

Синтаксис:
УстановитьСсылкуНового(<Ссылка>)
Параметры:

<Ссылка> (обязательный)
Тип: СправочникСсылка.<Имя справочника>.
Ссылка, которая будет назначена при записи нового объекта.
Описание:

Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа. Уникальность ссылки проверяется при записи объекта.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

См. также:
СправочникМенеджер.<Имя справочника>, метод ПолучитьСсылку

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Назначить новому товару ссылку, не создавая запись в базе

ПолучитьСсылку строит ссылку из UUID. Такая ссылка ещё не означает существование товара. Назначаем её новому объекту и проверяем это различие.

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

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

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

  2. Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

  5. Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.


Если Метаданные.Справочники.Найти("УчебныеТовары") = Неопределено Тогда
    ВызватьИсключение "Сначала создайте учебный справочник по подготовке";
КонецЕсли;

Идентификатор = Новый УникальныйИдентификатор;
ПлановаяСсылка = Справочники.УчебныеТовары.ПолучитьСсылку(Идентификатор);
Товар = Справочники.УчебныеТовары.СоздатьЭлемент();
Товар.Наименование = "Учебная книга со ссылкой";
Товар.УстановитьСсылкуНового(ПлановаяСсылка);
Сообщить(Товар.ПолучитьСсылкуНового() = ПлановаяСсылка);
Сообщить(ПлановаяСсылка.УникальныйИдентификатор() = Идентификатор);
Сообщить(Не ПлановаяСсылка.Пустая());
Сообщить(Товар.ЭтоНовый());
Сообщить(ПлановаяСсылка.ПолучитьОбъект() = Неопределено);
Сообщить(ПлановаяСсылка.Метаданные().Имя = "УчебныеТовары");

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

  1. Новый UUID задаёт идентичность предполагаемой ссылки; ПолучитьСсылку не читает и не создаёт объект в базе.

  2. УстановитьСсылкуНового применим к новому незаписанному объекту. Проверка уникальности выполняется при будущей записи.

  3. ПолучитьСсылкуНового возвращает назначенное значение, которое сравниваем с плановой ссылкой.

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

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

  1. Все шесть сравнений дают Истина для нового случайного UUID в пустой учебной базе.

  2. Товар остаётся новым, список справочника не изменяется.

  3. ПолучитьОбъект для плановой ссылки возвращает Неопределено, а не новый автоматически записанный товар.

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

Показано различие между непустой ссылкой, назначением идентичности и существованием записи.

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

  1. Не назначайте ссылку существующего товара новому объекту: это не способ обновления данных.

  2. Случайный UUID не является кодом товара, артикулом или универсальным ID внешнего API. Контракт обмена проектируют отдельно.

  3. Не вызывайте свойства данных у ссылки на отсутствующий объект в расчёте на автоматическое создание записи.

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

Записать учебный товар внутри транзакции и намеренно отменить

В новой пустой учебной базе проверяем, что отмена транзакции убирает созданную запись. Никаких существующих товаров не удаляем.

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

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

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

  2. Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

  5. Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.

  6. Это единственный фрагмент данной группы, который вызывает Записать. Выполняйте строго в новой пустой базе Учебная85 с пустым модулем справочника; транзакция намеренно отменяется.

  7. Не запускайте в рабочей конфигурации: её обработчики записи могут иметь внешние побочные действия, которые откат базы не отменяет.


Если Метаданные.Справочники.Найти("УчебныеТовары") = Неопределено Тогда
    ВызватьИсключение "Сначала создайте учебный справочник по подготовке";
КонецЕсли;

Товар = Справочники.УчебныеТовары.СоздатьЭлемент();
Товар.Наименование = "Учебный товар с отменой";
Товар.Артикул = "ROLLBACK-ONLY";
Товар.Цена = 250;
Ссылка = Справочники.УчебныеТовары.ПолучитьСсылку(Новый УникальныйИдентификатор);
Товар.УстановитьСсылкуНового(Ссылка);
Если ТранзакцияАктивна() Тогда
    ВызватьИсключение "Запустите упражнение вне существующей транзакции";
КонецЕсли;
НачатьТранзакцию();
Попытка
    Товар.Записать();
    Внутри = Ссылка.ПолучитьОбъект();
    Сообщить(Внутри <> Неопределено);
    Сообщить(Не Товар.ЭтоНовый());
    ОтменитьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Сообщить(Не ТранзакцияАктивна());
Сообщить(Ссылка.ПолучитьОбъект() = Неопределено);

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

  1. До начала проверяем, что чужая транзакция не активна. Не отменяем транзакцию вызывающего кода.

  2. Записываем только собственный новый объект с новым UUID и читаем его внутри этой транзакции.

  3. ОтменитьТранзакцию откатывает запись, после чего снова проверяем существование через ссылку.

  4. В случае ошибки отменяем только ещё активную транзакцию данного упражнения и передаём исключение дальше.

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

  1. Внутри транзакции объект получен; после записи ЭтоНовый=Ложь.

  2. После отмены транзакция не активна и ПолучитьОбъект возвращает Неопределено.

  3. В списке УчебныеТовары нет нового учебного товара после завершения упражнения.

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

Запись собственной учебной строки была отменена без удаления существующих объектов.

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

  1. Отмена транзакции не откатывает HTTP-запросы, отправленные письма и внешние файлы. Поэтому база и обработчики специально изолированы.

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

  3. Записать может вызывать код объекта и подписки; в подготовке их намеренно нет.

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

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

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

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

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