Имя: Пароль:
1C
 
Быстрый способ определения битой ссылки
0 maxp77
 
03.08.09
12:41
Хотел бы к статье из книги знаний Книга знаний: v8: Пустые ссылки добавить свою функцию определения битой ссылки http://infostart.ru/blogs/1241/
1 ТелепатБот
 
гуру
03.08.09
12:41
2 maxp77
 
03.08.09
12:42
Итак,

способ определения битой ссылки через Ссылка.ПолучитьОбъект() очень медленный;

через Найти(Строка(Ссылка),"<Объект не найден>") <> 0 - некорректный (на мой взгляд),

поэтому представляю на Ваш суд функцию, позволяющую быстро определить битая ссылка или нет.

Текст функции:

Функция ОбъектБДСуществует(ТестоваяСсылка) Экспорт

   МД = Метаданные.НайтиПоТипу(ТипЗнч(ТестоваяСсылка));
   ИмяОбъекта = МД.Имя;
   ПолноеИмяОбъекта = МД.ПолноеИмя();

   Запрос = новый Запрос();
   Запрос.Текст =
   "ВЫБРАТЬ
   |   " + ИмяОбъекта + ".Ссылка КАК СсылкаБД
   |ИЗ
   |   " + ПолноеИмяОбъекта + " КАК " + ИмяОбъекта + "
   |ГДЕ
   |   " + ИмяОбъекта + ".Ссылка = &Cсылка";
   Запрос.УстановитьПараметр("Cсылка", ТестоваяСсылка);
   РезультатЗапроса = Запрос.Выполнить();

   Возврат Не РезультатЗапроса.Пустой();

КонецФункции

При желании можно добавить какой-нибудь кеш для текстов запросов по полному имени объекта, но не думаю,

что это сильно ускорит работу данной функции, она и без того быстро отрабатывает.
3 zbv
 
03.08.09
12:43
(2) сравнительные замеры производительности проводил?
4 H A D G E H O G s
 
03.08.09
12:49
Запрос.Текст =
   "ВЫБРАТЬ
   |   ИСТИНА как НЕЧТО
   |ИЗ
   |   " + ПолноеИмяОбъекта + " КАК " + ИмяОбъекта + "
   |ГДЕ
   |   " + ИмяОбъекта + ".Ссылка = &Cсылка";
   Запрос.УстановитьПараметр("Cсылка", ТестоваяСсылка);
   РезультатЗапроса = Запрос.Выполнить();
5 Широкий
 
03.08.09
12:52
Найти(Строка(Ссылка),"<Объект не найден>") ИМХО - достаточно и такого
6 H A D G E H O G s
 
03.08.09
12:53
(5) Нет.
Это достаточно медленно.
7 Bober
 
03.08.09
12:57
у (2, 4) есть сущ. плюс перед (5), можно за раз обработать список из битых ссылок.
8 MSensey
 
03.08.09
13:28
(4) так будет быстрее или в чем сакраментальный смысл?
9 Serg_1960
 
03.08.09
13:32
Мне интересно - что автор получит запросом, если у него "битыми" окажутся индексы, а не данные?
10 MSensey
 
03.08.09
13:36
Битые индексы реже встречаются, чем битые ссылки. С битыми индексами вообще труба (а такок вообще бывает?).
11 H A D G E H O G s
 
03.08.09
13:38
(9) Скорее всего - не найдет объект.
(8) Ну типа 1 байт - вместо 16. Верх оптимизма :-)
12 hhhh
 
03.08.09
13:41
(8) должно быть быстрее, потму что метаданные - уж очень тормозная штука.
13 Serg_1960
 
03.08.09
13:43
(10) Бывает. В файловой версии и не такое бывает. Про дублирование индексов (точнее - ключевых полей) Вы наверное слышали...
Можно мне еще один вопрос? При получении ссылки - происходит-ли обращение к данным или значение из индекса возвращается?
14 serffer
 
03.08.09
13:46
У 1С вроде индексы на ссылках... план выполнения полезет в индекс.Так?
15 MSensey
 
03.08.09
13:48
А для справочника случаем не создается кластерный индекс?
16 дущ
 
03.08.09
13:50
Т.е. запрос из (2) подымает абсолютно все элементы справочника (а их может быть и 10, и 1000, и 100000) и каждый из них сравнивает с этой самой пустой ссылкой? Это точно быстрее? На больших справочниках пробовал?
17 maxp77
 
03.08.09
13:52
(4) Спасибо, со строкой "ИСТИНА как НЕЧТО" чуть быстрее должна быть.
18 maxp77
 
03.08.09
13:54
(16) не с пустой, а с битой; точно быстрее
19 H A D G E H O G s
 
03.08.09
13:59
(16) Не глупим.
Поиск по индексу.
20 maxp77
 
03.08.09
14:02
(19) ну, да, извиняюсь...
А касательно битых индексов, так средствами 1С что можно сделать?
21 maxp77
 
03.08.09
14:04
(19) :)
22 H A D G E H O G s
 
03.08.09
14:04
(20) Ничего.
Самое главное - узнать их наличие.
Если есть - реиндексация в ТИИ
23 maxp77
 
03.08.09
14:06
(22) т.е. только средствами СУБД? а для файловой такой косяк возможен?
24 Serg_1960
 
03.08.09
14:08
Сорри, за "провокационные" вопросы, но я лично "предпочитаю" делать ТиИ для поиска "битых" ссылок :) А ежели запросом, например для документов, - то поиск по пустому значению номера и даты для выявления "битых" ссылок. Медленно, но имхо, - надежнее.
25 Фауст
 
03.08.09
14:09
Функция будет воспринимать пустую ссылку как битую...
26 maxp77
 
03.08.09
14:10
через тестирование и исправление поиск быстрей получится конечно же, но мне необходимо было программно отлавливать такие ссылки а не через ТиИ
27 maxp77
 
03.08.09
14:11
(25) спасибо, косяк. Исправим.
28 Serg_1960
 
03.08.09
14:13
(провокация) Битые ссылки еще бывают и в табличных частях документов...
29 maxp77
 
03.08.09
14:15
(25) хотя какой косяк, функция определяет наличие ссылки в конкретной таблице базы, пустой там быть не должно, так что все ОК
30 H A D G E H O G s
 
03.08.09
14:17
(24) Да ну, не сильно и медленнее.
31 maxp77
 
03.08.09
14:19
(28) вот ты эту "битую" ссылку подставь в функцию и определишь битая она или нет
32 maxp77
 
03.08.09
14:21
(30) ТиИ с данной функцией не сравнивал: не было необходимости; поэтому могу только предполагать
33 hhhh
 
03.08.09
14:23
(32) ну ПолучитьОбъект() из ссылки явно должно быть быстрее, чем НайтиПоТипу в офигенном списке метаданных.
34 maxp77
 
03.08.09
14:24
(25) проверку на пустую ссылку и вообще на ссылочный тип необходимо предварительно выполнить, если в этом нет уверенности
35 maxp77
 
03.08.09
14:24
(33) ну, ну...
36 hhhh
 
03.08.09
14:26
(35) реально. Из-за этого в типовой БП такие тормозные журналы. Потому что они на ходу проверяют, есть ли реквизит в метаданных.
37 H A D G E H O G s
 
03.08.09
14:27
(33) Забьем на бутылку кефира?

Например, мой справочник
СерииНоменклатуры.
Со всеми характеристиками серии для алкоголя, которые загнали в реквизиты справочника товарисчи франчи КТ2000. :-)
61 реквизит + 5 ТЧ по 4-5 реквизитов.
38 maxp77
 
03.08.09
14:32
(37) ого, прикольные франчи:)
39 maxp77
 
03.08.09
14:35
(3) производил
40 hhhh
 
03.08.09
14:41
(37) всё равно получит за одно обращение к базе. 61 реквизит * 100 байт, получится 6 кб. Неужели у тебя такой маломощный сервер?
41 H A D G E H O G s
 
03.08.09
14:44
(40) "Па лесам бродют санитары, они вас будут подбирать". © Агата Кристи.
Откуда 100 байт :-) ?
42 MSensey
 
03.08.09
14:46
(40) а разве время выполнения в байтах измеряют?
43 Serg_1960
 
03.08.09
14:46
Отлучился на пять минут, а тут уже... бродют санитары :) Вы о чем спорите в чужой ветке? :))
44 maxp77
 
03.08.09
14:50
да, мне самому интересно что быстрее, на тех экспериментальных данных, на которых я проверял моя функция отрабатывает в разы!! быстрее аналогов. Может, где-то при каких-то условиях медленнее?
45 H A D G E H O G s
 
03.08.09
14:51
(44) Все пучком у тебя.
hhhh шутит.
У него в БД просто поля - ровно по 100 байт храняться.
Там - вырожденный случай :-)