Имя: Пароль:
1C
 
Как назначить ссылку новому объекту перед записью?
0 zmb
 
01.03.07
17:39
Создаю в восьмерке элемент справочника, еще не записываю, но надо получить Ссылку.
1 Три буквы
 
01.03.07
17:40
зачот!
2 Max_Minsk
 
01.03.07
17:40
(0) Покажи как создаешь.
3 Ц_У
 
01.03.07
17:40
нельзя получить ссылку на несуществующий элемент
4 Широкий
 
01.03.07
17:41
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
ПолучитьСсылкуНового (GetNewObjectRef)
Синтаксис:
ПолучитьСсылкуНового()
Возвращаемое значение:
Тип: СправочникСсылка.
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом УстановитьСсылкуНового() значение ссылки.
См. также:
СправочникМенеджер, метод ПолучитьСсылку
5 Max_Minsk
 
01.03.07
17:41
(3) Почему? У него уже GUID есть при создании.
6 dimoff
 
01.03.07
17:41
УстановитьСсылкуНового
7 zmb
 
01.03.07
17:42
хз, нельзя, можно, тем не менее в синтаксис помошнике есть какие-то методы, но написано там все коряво и не понятно.
8 dimoff
 
01.03.07
17:42
(7) Два простых метода, в 6 и в 4, чего сложного
9 Три буквы
 
01.03.07
17:44
век живи, век учись.
интересно, а в каких ситуациях это бывает нужно?
10 Terv
 
01.03.07
17:45
(9) самое частое при обмене.
11 Vozhd
 
01.03.07
17:45
(9) В случаях, когда лень использовать транзакции...
12 zmb
 
01.03.07
17:47
Кроме флуда, может кто написать просто пример, если так все просто?
13 Ц_У
 
01.03.07
17:47
(9)+1 ..век...дураком помрешь (с)
14 Колумбарий
 
01.03.07
17:47
2(9) Например при обменах... когда топология баз - звезда
15 asady
 
01.03.07
17:47
16 Три буквы
 
01.03.07
17:47
(11)эээ?
17 Vozhd
 
01.03.07
17:49
(16) угу!
18 TormozIT
 
гуру
01.03.07
17:52
Привожу код из типовых УТ И УПП.

Если ЭтоНовый() Тогда
   СсылкаНового = Справочники.Контрагенты.ПолучитьСсылку();
   УстановитьСсылкуНового(СсылкаНового);
   ГоловнойКонтрагент = СсылкаНового;
Иначе
   ГоловнойКонтрагент = Ссылка;
КонецЕсли;

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

Правильно будет заменить типовой код на этот:

Если ЭтоНовый() Тогда
   ГоловнойКонтрагент = ПолучитьСсылкуНового();
Иначе
   ГоловнойКонтрагент = Ссылка;
КонецЕсли;
19 TormozIT
 
гуру
01.03.07
17:53
Как показывают мои исследования  

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

неявно вызывается всегда у нового объекта при его создании и нет смысла ее снова устанавливать, ведь кто то до этого уже мог использовать старую ссылку нового. А при установке ссылки нового вы принудительно меняете. И, все ссылки на старую ссылку нового станут невалидными после записи объекта.
20 dimoff
 
01.03.07
17:55
(18) Что значит "невалидными"?
21 TormozIT
 
гуру
01.03.07
17:55
(20) "<объект... не найден..."
22 dimoff
 
01.03.07
17:56
(21) Где он будет не найден, если он никуда не записывался?
23 dimoff
 
01.03.07
17:57
Глюк бывает когда в транзакции при записи создается новый объект и присываивается полю, но потом сам не записывается. Ссылка в поле остается, хотя объект не существует. Но подобное происходит без всяких УстановитьСсылкуНового
24 TormozIT
 
гуру
01.03.07
17:58

Если ЭтоНовый() Тогда
   СсылкаНового = Справочники.Контрагенты.ПолучитьСсылку();
   УстановитьСсылкуНового(СсылкаНового);
   ГоловнойКонтрагент = СсылкаНового;
Иначе
   ГоловнойКонтрагент = Ссылка;
КонецЕсли;
...
// Здесь нам снова нужно получить ссылку нового. Но мы не знаем, была ли она установлена раньше.
// Следую условию из описания мы снова устанавливаем ссылку нового.
Если ЭтоНовый() Тогда
    СсылкаНового = Справочники.Контрагенты.ПолучитьСсылку();
    УстановитьСсылкуНового(СсылкаНового);
    РезрвныйКонтрагент = СсылкаНового;
Иначе
    РезрвныйКонтрагент = Ссылка;
КонецЕсли;


Таким образом, после записи мы получим невалидную ссылку в реквизите "ГоловнойКонтрагент"
25 zmb
 
01.03.07
17:59
Стоп, напишите на примере номенклатуры :)
26 dimoff
 
01.03.07
18:00
(25) Скопируй все сообщения ТормозИТ в блокнот, вызови пункт Правка - Поиск и замена, замени Контрагенты на Номенклатура
27 TormozIT
 
гуру
01.03.07
18:00
Если ЭтоНовый() Тогда
   <ПутьКРевизитуДругогоОбъектаБД> = ПолучитьСсылкуНового();
Иначе
   <ПутьКРевизитуДругогоОбъектаБД> = Ссылка;
КонецЕсли;

Делай так и будет тебе счастье.
28 zmb
 
01.03.07
18:02
Кароче, я зря сюда зашел, тут больше половины только флудят и выёпываются, а остальные только пытаются предположить, ну и на том спасибо...
29 dimoff
 
01.03.07
18:02
(28) Не за что, заходи ещё, будет третья половина, которая пошлет тебя туда, куда ты заслуживаешь.
30 Vozhd
 
01.03.07
18:03
(28) Точно подмечено! Предлагаю обфлудить эту тему :-)
31 TormozIT
 
гуру
01.03.07
18:03
Ответ на (0) уже писали.
Я лишь еще раз обращаю твое внимание на него
ПолучитьСсылкуНового()
32 dimoff
 
01.03.07
18:04
(31) Хватит флудить
33 Vozhd
 
01.03.07
18:06
(32) Пожалуйста, не ограничивайте свободу слова инженеров знаний. ;-)
34 AntonioS
 
01.03.07
18:12
(18)
ПолучитьСсылкуНового (GetNewObjectRef)
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом УстановитьСсылкуНового значение ссылки.

Вот почему то тут говорят, про то, что получать можно только ранее установленную ссылку. В чем подвох?
35 TormozIT
 
гуру
01.03.07
19:25
(34) Да, написано. Однако (19)
36 TormozIT
 
гуру
01.03.07
20:58
Коллеги. Приношу свои извинения.
(18), (19), (27) не совсем верные утверждения.
Сейчас взял еще раз проверил ситуацию.
В некоторых случаях, в самом деле, платформа сразу неявно вызывает УстановитьСсылкуНового() при создании объекта. Но в некоторых она этого не делает. Закономерность я пока не смог установить. Поэтому правильное получение ссылки нового, на мой взгляд, должно выглядеть так:

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