Имя: Пароль:
1C
1С v8
Создание нового элемента справочника: объект, ссылка. Запутался
0 zelenprog
 
30.06.23
15:57
Обработка создает новых контрагентов, и соответствующих партнеров.

В типовых модулях нашел и использую в обработке вот такой код:

    ПартнерОбъектДляЗаписи = Справочники.Партнеры.СоздатьЭлемент();
    СсылкаНовогоПартнера = Справочники.Партнеры.ПолучитьСсылку();
    ПартнерОбъектДляЗаписи.УстановитьСсылкуНового(СсылкаНовогоПартнера);

    КонтрагентОбъектДляЗаписи = Справочники.Контрагенты.СоздатьЭлемент();
    СсылкаНовогоКонтрагента = Справочники.Контрагенты.ПолучитьСсылку();
    КонтрагентОбъектДляЗаписи.УстановитьСсылкуНового(СсылкаНовогоКонтрагента);

    ПартнерОбъектДляЗаписи.Записать();

    КонтрагентОбъектДляЗаписи.Партнер = ПартнерОбъектДляЗаписи.Ссылка;
    КонтрагентОбъектДляЗаписи.Записать();

Вроде все работает...
Но непонятно, зачем так сложно?

Зачем нужны вот эти строки?
Что они делают?

    СсылкаНовогоКонтрагента = Справочники.Контрагенты.ПолучитьСсылку();
    КонтрагентОбъектДляЗаписи.УстановитьСсылкуНового(СсылкаНовогоКонтрагента);

У элемента справочника ведь уже есть реквизит "Ссылка": КонтрагентОбъектДляЗаписи.Ссылка.
Этого не достаточно?

Объясните пожалуйста.
1 Asmody
 
30.06.23
16:19
По умолчанию, у нового незаписанного объекта ещё нет ссылки.

УстановитьСсылкуНового() позволяет использовать ссылку на объект до записи самого объекта. Как бы гарантируется, что при записи объекту будет установлено именно это значение ссылки.

ПолучитьСсылку() без параметра вернёт гарантированно уникальную ссылку нужного типа.

В вашем случае можно было обойтись и без них
2 lubitelxml
 
30.06.23
16:25
(0) если это весь код процедуры/функции? Смысла в приведенном коде использовать методы УстановитьСсылкуНового() и ПолучитьСсылку() реально нет
3 zelenprog
 
30.06.23
16:33
(1)
А если бы мне пришлось присвоить какому-то реквизиту ссылку еще незаписанного объекта?
Тогда нужно было бы делать УстановитьСсылкуНового() и ПолучитьСсылку()?
Верно я понял?
4 unenu
 
30.06.23
16:41
На самом деле тс "вырвал" контекст и создал неявную манипуляцию: "ой, это лишнее".
Сейчас это самый попсовый манипул собственного сознания. Ведь так лень разбираться во всей картине мире,
проще выхватить кусочек и вопеть)

в типовых так:

....
Если Не ЗначениеЗаполнено(ГоловнойКонтрагент) И Не ОбособленноеПодразделение Тогда
        
        Если СоздатьКонтрагента Тогда
            НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку();
            КонтрагентОбъект.УстановитьСсылкуНового(НоваяСсылка);
            ГоловнойКонтрагент = КонтрагентОбъект.ПолучитьСсылкуНового();
        Иначе
            ГоловнойКонтрагент = КонтрагентПартнера;
        КонецЕсли;
        
    КонецЕсли;
    КонтрагентОбъект.ГоловнойКонтрагент = ГоловнойКонтрагент;
    ПартнерыИКонтрагенты.ЗаполнитьКонтактнуюИнформациюКонтрагентаПартнера(КонтрагентОбъект, ЭтотОбъект, Объект.КонтактнаяИнформация);
    ПартнерыИКонтрагентыЛокализация.ПередЗаписьюКонтрагентаПартнера(КонтрагентОбъект, ЭтаФорма);
    // ИнтернетПоддержкаПользователей.РаботаСКонтрагентами
    ПроверкаКонтрагентов.ПередЗаписьюНаСервереКонтрагент(ЭтотОбъект, КонтрагентОбъект);
    // Конец ИнтернетПоддержкаПользователей.РаботаСКонтрагентами
    КонтрагентОбъект.Записать();
    
    КонтрагентПартнера = КонтрагентОбъект.Ссылка;
....
т.е. как минимум не пустая ссылка объектва нужна для записи связанных реквизиртов, КИ и т.п.
5 lubitelxml
 
30.06.23
16:42
(4) ну собственно о чем я и говорил, код не весь приведен, поэтому и "гладиолус"