Имя: Пароль:
1C
 
Справочники.Номенклатура.ПолучитьСсылку - как понять что не пусто?
0 Double_Medved
 
29.11.21
11:59
Добрый день.

Заполняю список номенклатуры, по уидам.

Как правильно обработать ошибку, если по иуду ничего нет, не тратя время на получение обьекта?

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


Ну то есть что выдаст Номен=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураАтрибутов.ref) если нет ничего там? Неопределено, пустую ссылку? Как это корректно обработать?
1 ДенисЧ
 
29.11.21
12:02
Номен.Пустая() пробовал?
2 Ёпрст
 
29.11.21
12:03
= Справочники.Номенклатура.ПустаяССылка()
3 youalex
 
29.11.21
12:04
ОбщегоНазначения.СсылкаСуществует()
4 ДедМорроз
 
29.11.21
12:04
Там не пустая ссылка а битая - запросить из базы ссылку при условии ссылки самый простой вариант.
5 VitaliyTokarev
 
29.11.21
12:09
(3) Может проще получить объект и проверить на неопределено?

Функция СсылкаСуществует(ПроверяемаяСсылка) Экспорт
    
    ТекстЗапроса = "
    |ВЫБРАТЬ ПЕРВЫЕ 1
    |    1
    |ИЗ
    |    [ИмяТаблицы]
    |ГДЕ
    |    Ссылка = &Ссылка
    |";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ПроверяемаяСсылка));
    
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка", ПроверяемаяСсылка);
    
    УстановитьПривилегированныйРежим(Истина);
    
    Возврат НЕ Запрос.Выполнить().Пустой();
    
КонецФункции
6 Double_Medved
 
29.11.21
12:11
(1)(2) И так и так вроде срабатывает, спасибо
7 Галахад
 
гуру
29.11.21
12:12
(6) Не должно же.
8 Kassern
 
29.11.21
12:13
(5) и при этом вы скинули внутрянку функции СсылкаСуществует))
9 youalex
 
29.11.21
12:32
(5) "получить объект" потащит из БД все данные объекта,включая ТЧ,  это избыточно в данном случае.
10 VladZ
 
29.11.21
12:34
(0) ЗначениеЗаполнено()
11 Галахад
 
гуру
29.11.21
12:36
(10) Не сработает.
12 Ёпрст
 
29.11.21
12:38
(4) Да, тип того надо


Номен=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураАтрибутов.ref));
    ЗапросБитаяССылка = Новый Запрос;
                ЗапросБитаяССылка.Текст =
                    "ВЫБРАТЬ
                    |   ИСТИНА как НЕЧТО
                    |ИЗ
                    |   Справочник.Номенклатура КАК Номенклатура
                    |ГДЕ
                    |  Номенклатура.Ссылка = &Cсылка";
                    ЗапросБитаяССылка.УстановитьПараметр("Cсылка", Номен);
                    РезультатЗапроса = ЗапросБитаяССылка.Выполнить();
                    Если РезультатЗапроса.Пустой() Тогда
                        Номен = Справочник.Номенклатура.СоздатьЭлемент();
                        Номен.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураАтрибутов.ref)));
                    Иначе
                        Номен = Номен.ПолучитьОбъект();
                    КонецЕсли;
13 mistеr
 
29.11.21
13:47
(0) Понять, есть объект в базе или нет, можно только поискав его в базе. :) От этого никуда не деться.
Ускорить это можно только сделав один запрос для списка ссылок.
14 VladZ
 
29.11.21
14:54
(11) Номен=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураАтрибутов.ref));
Если Не ЗначениеЗаполнено(Номен) Тогда
// нет такой
КонецЕсли;

Почему не сработает?
15 pechkin
 
29.11.21
14:55
(14) битая ссылка она заполнена
16 lodger
 
29.11.21
15:45
(5) нет, не проще. эти МНОГАСТРОКОДА отработают в сотни раз быстрее, чем получить объект = неопределено.
а если завернуть это в один большой запрос (когда много ссылок надо проверить), тогда разница производительности достигнет тысяч раз.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший