Имя: Пароль:
1C
 
Можно ли без перебора метаданных найти ссылку по GUID?
0 Гений 1С
 
гуру
07.06.07
12:36
А то метод ПолучитьСсылку работает только для конкретного менеджера.
А если я не знаю тип?

Функция обНайтиСсылкуПоГУИД(ГУИД) Экспорт
   Перем РезСсылка;
   Для Каждого МД Из Метаданные.Справочники Цикл
       РезСсылка=Справочники[МД.Имя].ПолучитьСсылку(ГУИД);
       Если РезСсылка.ПолучитьОбъект()<>Неопределено Тогда
           Возврат РезСсылка;
       КонецЕсли;
   КонецЦикла;
   Для Каждого МД Из Метаданные.Документы Цикл
       РезСсылка=Документы[МД.Имя].ПолучитьСсылку(ГУИД);
       Если РезСсылка.ПолучитьОбъект()<>Неопределено Тогда
           РезСсылка.ПолучитьОбъект();
           Возврат РезСсылка;
       КонецЕсли;
   КонецЦикла;
   Возврат Неопределено;
КонецФункции
1 ТелепатБот
 
гуру
07.06.07
12:36
2 Гений 1С
 
гуру
07.06.07
18:23
ап
3 Ferz
 
08.06.07
09:10
только через SQL
4 FLENDGER
 
08.06.07
10:13
офф:
гениальное решение - сразу пиши в книгу знаний...
тупой перебор - рулит... я так чувствую, ты во всех случаях, когда не можешь придумать хоть какое-то реальное решение, просто прогоняешь данные через тупой перебор... сочувствую тем, кто пользуется твоими поделками :(
5 FLENDGER
 
08.06.07
10:30
+4
создаем рег. сведений, в который пишем при записи объектов ссылки и в качестве ресурса - тип объекта или имя из метаданных...
а потом просто ищем ссылку в этом регистре... :)
6 Гений 1С
 
гуру
08.06.07
10:46
(5) Хахаха.... А про транзакционную нагрузку на базу ты подумал? К тому же это не универсальное и даже вредное явление. Яйца курицу учат? Гыгыгы
7 MRAK
 
08.06.07
10:58
(5) ужос
8 PowerBoy
 
08.06.07
11:13
(0) Тоже, искал решение и не нашел. Делал перебором из списка.
Кстати
РезСсылка.ПолучитьОбъект()
работает очень, очень медленно.
Строка(РезСсылка) = ""
работает в два раза быстрей, но тоже медленно.
9 НЕА123
 
08.06.07
12:01
(0) ОФФ
Справочники[МД.Имя] в контексте можно просто МД.
10 FLENDGER
 
08.06.07
14:59
то (6)
Вот в (4) такая же бредовая хрень, как и в (0)... Особенно в плане того, чтобы пихать подобные хрени в КЗ... А вот теперь иди и считай, сколько такой хрени ты занес в КЗ, где неопытные вместо того, чтобы найти что-нибудь стоящее, забивают голову ерундой...
P.S. какова задача - такого решение... чтобы получить запросом данные по гуиду, надо чтобы он был там в той форме, куда позволяет доставать запрос... отсюда и решение (4) ;)
а теперь попробуй доказать, что на данный момент есть еще решение, при котором ты ЗАПРОСОМ вытянешь ссылку по гуиду...

PPS а про курицу мне понравилось... :)
11 dolter
 
08.06.07
15:08
А откуда взят ГУИД? если из таблицы, то можно для ускорения перебора узнать ограничения типа...
12 НЕА123
 
08.06.07
15:16
НайтиПоСсылкам(<Список ссылок>)
Параметры:
<Список ссылок> (обязательный)
Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:
Тип: ТаблицаЗначений. Возвращает ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 - искомая ссылка; 1 - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, идентифицирующее запись необъектной таблицы; 2 - объект метаданных, которому соответствуют данные, в которых найдена ссылка.
Описание:
Осуществляет поиск ссылок на объекты, переданные в параметре <Список ссылок>.
13 НЕА123
 
08.06.07
15:18
(12)-точно, бред. не читать.:((
14 Леха Дум
 
08.06.07
15:27
(11) а какая разница, нам ведь нужно гениальное решение. гы куриц всегда с динозаврами сравниваю - после просмотра фильма "парк юрского периода"
15 Гений 1С
 
гуру
08.06.07
15:27
(13) я так и понял.
(10) ваш бред не осилил.

При чем здесь запросом.
Задача четкая - есть GUID, нужно найти объект.
НАпример, если данные пришли из журнала регистрации.
Для универсальности ищу решение, когда вид ссылки неизвестен.
16 Wladimir_spb
 
08.06.07
15:36
Запросом можно, но не уверен, что будет быстрее, чем (0).
17 Гений 1С
 
гуру
08.06.07
16:07
(16) да, запросом можно, но тоже не уверен, а если сразу по всем тэйблам, можно напороться на ошибку 255 таблиц. ;-) или только порциями по 255 таблиц, тогда можно. ;-)
18 FarFar
 
08.06.07
16:55
(0) Интересно,в 8.1 упростили поиск по ГУИДу?
19 Гений 1С
 
гуру
08.06.07
16:56
(18) с чего бы это, гыгыгы...
20 oleg_km
 
08.06.07
17:43
В запросах ГУИД тоже недоступен, только в объекте
21 Гений 1С
 
гуру
08.06.07
17:47
(20) а да, точно. ;-)
22 РазДва
 
09.06.07
09:37
(15) Если говорить про универсальность, то может быть ситуация, когда два элемента РАЗНЫХ справочников или документов имеют одинаковый ГУИД.
23 Ferz
 
09.06.07
10:38
(22) нужно проверить.. вероятность ничтожна
24 РазДва
 
09.06.07
10:50
(23) Если вы напишете при создании элемнетов УстановитьСсылкуНового(ОдинаковыйГУИД), то вероятность будет 100%.
На вероятность нельзя полагаться при универсальном решении.
25 НЕА123
 
09.06.07
10:50
(22)+
ЗначениеВСТрокуВнутр(Объект.Ссылка) выдает нечто1.
Объект.Ссылка.УникальныйИдентийикатор() тоже выдает нечто2.
Нечто2 являнтся подмножеством Нечто1. (все перетасовано, но видно).
26 Immortal
 
09.06.07
11:35
мням..надо повернуть задачу в другую плоскость..
исать тип объекта.
27 Immortal
 
09.06.07
11:37
искать то есть..
28 Immortal
 
09.06.07
11:38
в гуиде есть информация о таблице в которой храниццо элемент или нет?
29 НЕА123
 
09.06.07
11:43
(28)  - судя по (25) - нет. +(РазДва).
30 Immortal
 
09.06.07
11:46
мдамс.. странно.
31 Гений 1С
 
гуру
09.06.07
11:52
(28) Ничего странного, так задумано. В GUID нет типа объекта, иначе бы не хватило места на уникальность.
32 Immortal
 
09.06.07
12:18
(31) ты неправ.. есть там привязка или нет к таблице при формировании гуида
никак не скажется на уникальности.
если только на очень больших объёмах записей(~триллионы)
33 FLENDGER
 
09.06.07
12:52
Если есть задача оптимизировать данную процедуру в (0), если возможность не использовать ПолучитьОбъект, который работает очень медленно, кроме того обращается к базе и требует от пользователя дополнительных прав на объекты...

В качестве альтернативы можно использовать подобную функцию
Функция ПроверитьСсылку(Знач Ссылка, Знач Гуид)
   Перем Результат;
   Результат = Истина;
   
       //Получаем из ГУИДа ссылку в том формате, который использует сама 1С
   ТекстГуид = "" + ГУИД;
   СсылкаИзГУИД = "";
   ПозицияТире = Найти(ТекстГуид, "-");
   к = 0;
   Пока ПозицияТире > 0 И к <= 2 Цикл
       СсылкаИзГУИД = Лев(ТекстГуид, ПозицияТире-1) + СсылкаИзГУИД;
       ТекстГуид = Сред(ТекстГуид, ПозицияТире+1);
       ПозицияТире = Найти(ТекстГуид, "-");
       к = к + 1;
   КонецЦикла;
   СсылкаИзГУИД = СтрЗаменить(ТекстГуид, "-", "") + СсылкаИзГУИД;
   
   //Проверяем, есть в полученной ссылке системные строки
       Если Найти("" + Ссылка, "Объект не найден") > 0 И Найти("" + Ссылка, СсылкаИзГУИД) > 0 Тогда
       Результат = Ложь;
   КонецЕсли;
   
   Возврат Результат;
КонецФункции


Алгоритм не оптимален, но в принципе довольно надежен...
34 Гений 1С
 
гуру
09.06.07
15:34
(33) клево, слушай, а разве запрос в представлении не вернет для несущетвующего объекта Объект не найден? Тогда можно и запросом шебуршать, строго порциями по 255 таблиц, гыгыгы...