Имя: Пароль:
1C
1С v8
<Объект не найдет>, как красиво проверить?
0 Pro1001C
 
23.08.19
15:13
Получил ссылку по гуид, как красиво и правильно проверить, что это существующая ссылка, а не <Объект не найден>?
1 ДНН
 
23.08.19
15:15
Если Ссылка.ПолучитьОбъект() = Неопределено - значит "объект не найден"
2 RomanYS
 
23.08.19
15:17
(0) либо запросом, либо (1)
+С правами могут быть нюансы
3 KnightAlone
 
23.08.19
15:23
СсылкаНаДок = Документы.ВедомостьНаВыплатуЗарплатыВБанк.ПолучитьСсылку(УИД);
НашлийНужныйТип = СсылкаСуществует(СсылкаНаДок);

//проверяем, получили ли по UID объект или нет
Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт
    
    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    Ссылка КАК Ссылка
    |ИЗ
    |    [ИмяТаблицы]
    |ГДЕ
    |    Ссылка = &Ссылка
    |";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ЛюбаяСсылка.Метаданные().ПолноеИмя());
    
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка);
    
    Возврат НЕ Запрос.Выполнить().Пустой();
    
КонецФункции
4 Pro1001C
 
23.08.19
15:29
Спасибо!
5 1Садовник
 
23.08.19
15:36
(0) ЗначениеЗаполнено(Ссылка.ВерсияДанных)
6 GGDots
 
23.08.19
15:42
Несколько вариантов:

https://craft1c.ru/1s-bitaja-ssylka/
7 Oftan_Idy
 
23.08.19
16:03
(0) Самый быстрый способ это привести к Строке, и в строке найти слово "<объект не найден"
8 lodger
 
23.08.19
16:10
(7) все равно чтение базы для получения представления сделает. поэтому разница в между условно 19 и 20 мс.
9 RomanYS
 
23.08.19
16:13
(7) быстрее запроса?
10 lodger
 
23.08.19
16:18
(9) для 1 ссылки может и быстрее. лучше рассмотрите случай с тысячей ссылок.
11 dezss
 
23.08.19
16:21
(10) А разве получение представления - это не запрос к базе? О_о
Или ты про то, что может быть кэшировано?
12 lodger
 
23.08.19
16:24
(11)
сумма операций с явным кастомным запросом
Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка); + НЕ Запрос.Выполнить().Пустой();

всегда тяжелее в выполнении чем с неявным запросом
Строка(НекаяСсылка)
13 Cyberhawk
 
23.08.19
16:48
(3) Привилегированный режим забыл
14 Cyberhawk
 
23.08.19
16:48
(5) Это уже вариация (1), объект один хрен будет зачитываться целиком
15 Cyberhawk
 
23.08.19
16:49
(7) *овнокод. Может быть и англоязычная нотация.
16 Cyberhawk
 
23.08.19
16:50
(10) (12) Если проверить сразу несколько тогда уж программно собрать кусочный запрос и единоразово его выполнить
17 fimanich
 
23.08.19
17:34
(7) Строку проверить на объект не найден - не самый надежный. Например, в другой локализации (на др. языке) слов таких может не быть.
18 Tonik992
 
23.08.19
17:44
Я считаю, что неверно поставлена цель.
Не "как красиво проверить", а "как эффективно".

На мой взгляд самый эффективный способ в (3).
19 RomanYS
 
23.08.19
17:52
(18) "эффективно" расшифруй.
(3) похоже на "правильно"
(5) похоже на "красиво"
(7) как ни удивительно реально быстро
20 Tonik992
 
23.08.19
17:59
Эффективный с точки зрения обращения к базе данных.
Эффективный с точки зрения скорости выполнения.
21 RomanYS
 
23.08.19
18:14
(20) замер на простом (с точки зрения структуры) справочнике показывает как ни (очень!) странно, что он самый медленный

    Для инд = 1 по 1000 Цикл
        Ссылка = Справочники.Банки.ПолучитьСсылку();
        
        Запрос = Новый Запрос;//2%
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Банки.код
        |ИЗ
        |    Справочник.Банки КАК Банки
        |ГДЕ
        |    Банки.Ссылка = &Ссылка";
        
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();//28%
        
        Есть = НЕ РезультатЗапроса.Пустой();
        
        Ссылка = Справочники.Банки.ПолучитьСсылку();
        Есть = Ссылка.ПолучитьОбъект() <> Неопределено;//25%
        
        Ссылка = Справочники.Банки.ПолучитьСсылку();
        Есть = Найти(""+Ссылка, "<Объект не") = 0;//16%
        
        Ссылка = Справочники.Банки.ПолучитьСсылку();
        Есть = ЗначениеЗаполнено(Ссылка.ВерсияДанных);//24%
    КонецЦикла;

В комментах результат замера на файловой базе.
22 RomanYS
 
23.08.19
18:15
(21) комментарии про один запрос на тысячу ссылок не принимаются. В такой ситуации всё должно быть очевидно
23 palsergeich
 
23.08.19
18:19
ОбщегоНазначения.СсылкаСуществует
24 palsergeich
 
23.08.19
18:20
(21) А Вы я смотрю знатный изобретатель велосипедов
25 RomanYS
 
23.08.19
18:22
(24) скорее собиратель: все велосипеды из этой ветки
26 RomanYS
 
23.08.19
18:23
(23) там же (3) или что-то альтернативное?
27 palsergeich
 
23.08.19
18:23
(21) Потому что есть подозрение что в этот момент Справочники.Банки.ПолучитьСсылку() платформа что то кеширует, и дальше ты без обращения к БД делаешь быструю операцию, по этому запрос медленнее
28 palsergeich
 
23.08.19
18:23
(26) Одно и то же, он просто еще и листинг привел
29 RomanYS
 
23.08.19
18:26
(27) Не понял.
Справочники.Банки.ПолучитьСсылку() там перед каждой проверкой, ссылки каждый раз разные, что кэширует?
30 palsergeich
 
23.08.19
18:27
(25) + в запросе выбери не код, а ссылку, платформа ужас как не любит обращатся к лкластерному индексу, как бы там не было обращение к этому индексу Код + Ссылка
31 palsergeich
 
23.08.19
18:28
(30) Ой SQL точнее
32 RomanYS
 
23.08.19
18:31
(30) заменил, результат не поменялся. Было 28.02 стало 27.69
(31) замер на файловой базе