Имя: Пароль:
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) нет, не проще. эти МНОГАСТРОКОДА отработают в сотни раз быстрее, чем получить объект = неопределено.
а если завернуть это в один большой запрос (когда много ссылок надо проверить), тогда разница производительности достигнет тысяч раз.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn