|   |   | 
| 
 | <Объект не найдет>, как красиво проверить? | ☑ | ||
|---|---|---|---|---|
| 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 | ||||
| 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) замер на файловой базе | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |