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