Что означает ПолучитьСсылкуНового и УстановитьСсылкуНового
используется тогда, когда вместе с объектом надо записать какие-то сведения и хочется все это в одной транзакции сделать.
Например — при создании номенклатуры одновременно записать и цену ее. Тогда:
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
//заполнить новый элемент
НовыйЭлемент.УстановитьСсылкуНового(Новый УникальныйИдентификатор);
Запись = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
Запись.Номенклатура = НовыйЭлемент.ПолучитьСсылкуНового(); // вот сюда внимательно потому. Что в предыдущем посте я тебя наиграл
Или еще — когда ты загружаешь объекты из другой системы и тебе для синхронизации надо сохранить ГУИД объектов из другой системы. Тогда ты делаешь так:
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(ГУИДИзДругойСистемы);
НовыйЭлемент.Записать();
вот так еще понятнее
Если СправочникОбъект.ЭтоНовый() Тогда
СсылкаНового = СправочникОбъект.ПолучитьСсылкуНового();
Если СсылкаНового.Пустая() Тогда
СсылкаНового = Справочники[СправочникОбъект.Метаданные().Имя].ПолучитьСсылку();
СправочникОбъект.УстановитьСсылкуНового(СсылкаНового);
КонецЕсли;
СправочникОбъект[ИмяРеквизита] = Строка(СсылкаНового.УникальныйИдентификатор());
КонецЕсли;
Получение ссылки не записанного объекта 1С
Иногда необходимо получать ссылку нового объекта(например элемента справочника или документа) еще до того как он будет записан. Если попробовать получить его ссылку, через .Ссылка то в результате возвращена она будет пустой, так как ссылка для этого объекта еще не создана.
В такой ситуации нужно создать ссылку нового объекта самостоятельно. Для примера рассмотрим ситуацию когда необходимо получить ссылку нового(еще не записанного) документа Реализация товаров и услуг. Пусть НоваяРеализация — объект нового документа.
Для начала создадим новую ссылку на документ
Теперь присвоим ее объекту документа при помощи метода УстановитьСсылкуНового(<Ссылка>).
У нового документа реализации появилась ссылка, пока он не записан ее можно получить при помощи метода ПолучитьСсылкуНового().
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.
При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:
- При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
- При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.
Как узнать ссылку на объект до его записи
- Сгенерировать уникальный идентификатор объекта.
- Зарезервировать ссылку по уникальному идентификатору
- Установить зарезервированную ссылку для нового объекта.
//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;
//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;
//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;
После этого объект можно записать. Будет установлена заранее известная ссылка.
Особенности получения ссылок на новые объекты при обмене данными
Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:
При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.
Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.
Код будет выглядеть так:
ОригиналыПолучены = ПараметрыОбъекта [ "ОригиналыПолучены" ] ;
Если ОригиналыПолучены Тогда
//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;
МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;
//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;
МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;

ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите <Объект не найден>, т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
а как быть если нужно создать с тем же УИД, как и в исходной базе, как этот самый УИД получить?
УИД объекта можно получить с помощью функции УникальныйИдентификатор()
Чтобы задать объекту конкретный УИД нужно сделать так:
Новый_UID = Новый УникальныйИдентификатор(«1014270d-d794-11df-825c-001517542b78»);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый _UID);
НашаНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НашаНоменклатура.УстановитьСсылкуНового(НоваяСсылка);
Если нужно заменить УИД уже существующего объекта, то все равно создают новый объект — копию существующего, а потом выполняют поиск и замену ссылок по всей базе. Есть такая обработка даже. Если этого не сделать, получите везде вместо ссылки на объект с новым УИД .
Только при обмене не обязательно делать одинаковые УИД в базах. Сопоставление объектов происходит через регистр сведений Соответствия объектов информационных баз.
Копирование сведений для нового объекта
Возможно, я не открою ничего нового, но кому-то мой совет может пригодиться. Часто при создании нового объекта (например, элемента справочника «Номенклатура»), при попытке установить значения каких-то свойств, появляется надпись типа «Для выполнения данной операции необходимо записать элемент». Лично меня это немного напрягает. Предположим, что у нас есть регистр сведений «Цены продажи» с измерением «Товар». При открытии формы элемента цены из этого регистра отображаются в списке на форме. Пользователь хочет, чтобы при копировании элемента (по F9), цены копируемого элемента сразу появились бы на форме нового. Казалось бы, для этого надо просто скопировать записи регистра для старого элемента и указать в них ссылку нового. Но загвоздка в том, что новый элемент еще не записан, и следовательно ссылки для него не существует. Конечно, можно предварительно записать объект, а потом открыть форму, но при таком подходе при каждом нажатии кнопки «Добавить копированием» элементы справочника будут добавляться, даже если пользователь закроет форму редактирование без сохранения. Выход один – использовать метод УстановитьСсылкуНового() для элемента, созданного копированием. Ссылка для созданного, но еще не записанного объекта будет возвращена методом ПолучитьСсылкуНового().
Вот пример процедуры модуля объекта справочника номенклатура:
Установка Изображений Номенклатуры
Заполнения предоплат и отгрузок в документах: Поступления товаров, реализациях и платежках