Запись объекта, имеющего ссылку на еще не записанный объект

Задача

Имеется справочник А,  у него в подчинении справочник Б (реквизит Владелец у справочника Б имеет тип СправочникСсылка.А). При записи элемента справочника А в базу данных, нужно сперва создать и записать элементы справочника Б, которые будут ссылаться на элемент справочника А через реквизит Владелец. Все операции записи должны выполняться в одной транзакции! Если при записи элементов справочника Б происходит ошибка, то необходимо отказаться от записи элемента справочника А.

Приступим к решению

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

У справочника А в модуле объекта в событии ПередЗаписью пишем код:

// Если это новый элемент справочника, генерируем ссылку для него, иначе берем старую.
СсылкаНаОбъект = Справочники.А.ПустаяСсылка();
Если ЭтотОбъект.ЭтоНовый() Тогда
СсылкаНаОбъект = Справочники.А.ПолучитьСсылку(Новый УникальныйИдентификатор);
ЭтотОбъект.УстановитьСсылкуНового(СсылкаНаОбъект);
Иначе
СсылкаНаОбъект = ЭтотОбъект.Ссылка;
КонецЕсли;

// Создаем элементы справочника Б.
Для И = 0 По 10 Цикл
НовыйБ = Справочники.Б.СоздатьЭлемент();
НовыйБ.Наименование = "Наименование" + Строка(И);
НовыйБ.Владелец = СсылкаНаОбъект;
Попытка
НовыйБ.Записать();
Исключение
Отказ = Истина;
КонецПопытки;
КонецЦикла;

Аналогичные действия можно производить с другими объектными данными!

Комментарии