вторник, 7 февраля 2017 г.

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

Зачастую в типовых конфигурациях все сталкивались с автоматической загрузкой справочников "Контрагенты" и "ДоговорыКонтрагентов". Как правило загружая эти справочники мы заполняем поля ОсновнойДоговор для справочника Контрагенты и Владелец для справочника ДоговорыКонтрагентов. Для этого приходится вначале записать справочник Контрагенты набивая все возможные реквизиты, а потом создать договор, передать в договор ссылку новосозданого контрагента в качестве владельца, записать этот договор и опять установить записаный договор в реквизит справочника Контрагенты (ОсновнойДоговор). Ну и конечно опять записываем Контрагенты для сохранения измененного реквизита. 

Пример привычной записи: 

Процедура СоздатьКонтрагентыИДоговоры(РеквизитыЗаполненияКонтрагента, РеквизитыЗаполненияДоговора)

   //контрагент
   НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
   НовыйКонтрагент.УстановитьНовыйКод();
   ЗаполнитьЗначенияСвойств(НовыйКонтрагент, РеквизитыЗаполненияКонтрагента);

   НовыйКонтрагент.Записать();

   //договор
   ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
   ДоговорКонтрагента.УстановитьНовыйКод();
   ДоговорКонтрагента.Владелец   = НовыйКонтрагент.Ссылка;
   ЗаполнитьЗначенияСвойств(ДоговорКонтрагента, РеквизитыЗаполненияДоговора);
   
   ДоговорКонтрагента.Записать();

   //снова записуем
   НовыйКонтрагент.ОсновнойДоговорКонтрагента = ДоговорКонтрагента.Ссылка;
   НовыйКонтрагент.Записать();

КонецПроцедуры

Недостатки в двойной записи одного объекта справочника Контрагенты ну и запутанности. Предлагаю обратить внимание на методы ПолучитьСсылку() и УстановитьСсылкуНового(). Информацию о этих методах можно найти в синтаксис помощнике, а я просто приведу пример как обойти двойную запись одного объекта. Более того преимущество этого метода еще и в том, что не нужно использовать ".Ссылка" при использовании которого, система всецело кэширует объект в память. 
Процедура СоздатьКонтрагентыИДоговорыПоНовому(РеквизитыЗаполненияКонтрагента, РеквизитыЗаполненияДоговора)

   НовыйДоговорСсылка = Справочники.ДоговорыКонтрагентов.ПолучитьСсылку(Новый УникальныйИдентификатор); //получаем ссылку для основного договора контрагента

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

   НовыйКонтрагент.Записать();

   //договор
   ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
   ДоговорКонтрагента.УстановитьНовыйКод();
   ДоговорКонтрагента.УстановитьСсылкуНового(НовыйДоговорСсылка);
   ДоговорКонтрагента.Владелец                 = НовыйКонтрагентСсылка;
   ЗаполнитьЗначенияСвойств(ДоговорКонтрагента, РеквизитыЗаполненияДоговора);

   ДоговорКонтрагента.Записать();

КонецПроцедуры

Комментариев нет:

Отправить комментарий