Как отличить ссылку от объекта?

1. Kutuzov 739 21.01.14 11:20 Сейчас в теме
Есть параметр функции, в который передается либо объект, либо ссылка. Это может быть любой документ. Как понять - объект это, или ссылка?
Конструкция типа

Если Найти(ТипЗнчСтр(Документ), "ДокументОбъект") <> 0 Тогда
КонецЕсли;

Не вполне надежна, т.к. в наименовании документа может встретиться "ДокументОбъект"
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. starjevschik 21.01.14 12:08 Сейчас в теме
ДокументыМенеджер.ТипВсеСсылки (DocumentsManager.AllRefsType)
ДокументыМенеджер (DocumentsManager)
ТипВсеСсылки (AllRefsType)
Синтаксис:

ТипВсеСсылки()
Возвращаемое значение:

Тип: ОписаниеТипов.

Описание:

Получает описание типов, содержащее типы ссылок документов.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

МассивТипов = ЭлементыФормы.ПолеВводаВариант.ТипЗначения.Типы();
Для каждого ЭлементМассива Из МассивТипов Цикл
Если Документы.ТипВсеСсылки().СодержитТип(ЭлементМассива) Тогда
МассивНужныхТипов.Добавить(ЭлементМассива);
КонецЕсли;
КонецЦикла;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. deniseek77 86 21.01.14 11:29 Сейчас в теме
(1) Kutuzov, Не надо на вхождение строки проверять, надо проверять на типЗнч(НекоеЗначение)=ТипЗнч(Документ.ОказаниеУслугНапример.ПустаяСсылка()) тогда ссылка
12. Kutuzov 739 21.01.14 12:27 Сейчас в теме
(3) deniseek77, я же написал:
>Это может быть любой документ
Ваша конструкция не годится, т.к. вид документа не известен.
5. Rothschild 21.01.14 11:52 Сейчас в теме
(1) Kutuzov, можно вот так
Попытка
   СсылкаОбъекта = Объект.Ссылка;
   ОбъектОбъекта = СсылкаОбъект.ПолучитьОбъект();
Исключение
   СсылкаОбъекта = Null;
   ОбъектОбъекта = Неопределено;
КонецПопытки;

ЭтоОбъектныйТип = НЕ (СсылкаОбъекта = Null);
ЭтоОбъект = ЭтоОбъектныйТип И ТипЗнч(ОбъектОбъекта) = ТипЗнч(Объект);
Показать
2. fnxash 21.01.14 11:29 Сейчас в теме
Если Документ.Ссылка = Документ Тогда
// это ссылка
Иначе
// это объект
КонецЕсли;
11. Kutuzov 739 21.01.14 12:26 Сейчас в теме
(2) fnxash, нельзя через точку обращаться, это снижает быстродействие.
4. ZergKRSK 129 21.01.14 11:35 Сейчас в теме
А передавать в ф-цию только ссылку или только объект не судьба?
13. Kutuzov 739 21.01.14 12:28 Сейчас в теме
(4) ZergKRSK, если код обработки ссылки и объекта примерно одинаковый, то не судьба.
6. mrmasson 57 21.01.14 11:54 Сейчас в теме
Можно сделать проверку следующим образом (Работает для всех документов(!)):
Если ТипЗнч(Первый) = Тип("ДокументСсылка."+ТипЗнч(Первый)) Тогда
//ссылка
...
ИначеЕсли ТипЗнч(Первый) = Тип("ДокументОбъект."+ТипЗнч(Первый)) Тогда
//объект
.....
КонецЕсли;
Показать
10. Kutuzov 739 21.01.14 12:25 Сейчас в теме
(6) mrmasson, не работает, проверьте - выдает ошибку.
7. starjevschik 21.01.14 12:08 Сейчас в теме
ДокументыМенеджер.ТипВсеСсылки (DocumentsManager.AllRefsType)
ДокументыМенеджер (DocumentsManager)
ТипВсеСсылки (AllRefsType)
Синтаксис:

ТипВсеСсылки()
Возвращаемое значение:

Тип: ОписаниеТипов.

Описание:

Получает описание типов, содержащее типы ссылок документов.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

МассивТипов = ЭлементыФормы.ПолеВводаВариант.ТипЗначения.Типы();
Для каждого ЭлементМассива Из МассивТипов Цикл
Если Документы.ТипВсеСсылки().СодержитТип(ЭлементМассива) Тогда
МассивНужныхТипов.Добавить(ЭлементМассива);
КонецЕсли;
КонецЦикла;
8. SeverBaP 5 21.01.14 12:20 Сейчас в теме
(7) starjevschik, Ага хороший вариант
15. Rothschild 21.01.14 12:28 Сейчас в теме
(8) (14) SeverBaP,
возможно ... но только для документов.

вариант (5) - универсален - для любых ссылочных типов

к тому же он учитывает,
что перечисления особый "ссылочный" тип - у них нет объекта

и что возможно могут передаваться не "объектного" типа значения.
16. SeverBaP 5 21.01.14 12:36 Сейчас в теме
(15) Rothschild, нужно всегда стремится к избавлению всяких "попыток исключение конецпопытки"
17. Rothschild 21.01.14 12:44 Сейчас в теме
(16) SeverBaP,

нужно всегда стремится к избавлению всяких "попыток исключение конецпопытки"

есть аргументированное обоснование?
18. Rothschild 21.01.14 12:44 Сейчас в теме
(17)
ЗЫ
следует избегать передачи объектов (в смысле значений вроде "ДокументОбъект")
с клиента на сервер - это "мутабельные" значения
для файловой базы проканает, а для клиент-серверной - нет
9. Rothschild 21.01.14 12:23 Сейчас в теме
(7) starjevschik,
как я понимаю, задача стоит так:
как понять, что передали через параметр:
- ссылочный (объектный) это тип или нет
- и перадана ссылка на объект или сам объект
14. starjevschik 21.01.14 12:28 Сейчас в теме
(9) Rothschild, я так же понимаю, поэтому и предлагаю правильное штатное решение :)
Если Документы.ТипВсеСсылки().СодержитТип
19. O-Planet 6432 13.08.21 00:35 Сейчас в теме
Искал ответ на этот же вопрос. Почитал... Что-то все не понравилось. А так не пойдет?

Если Док.Ссылка = Док Тогда
// Док - это ссылка
Иначе
// Док - это объект
КонецЕсли;
20. O-Planet 6432 13.08.21 00:36 Сейчас в теме
Или даже так:

Если ТипЗнч(Док.Ссылка) = ТипЗнч(Док) Тогда
// Док - это ссылка
Иначе
// Док - это объект
КонецЕсли;
21. antonio_i 80 02.11.21 23:02 Сейчас в теме
Метод БСП.
ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Док));


Если БСП нет, можно посмотреть внутри - реализация простая, основанная на способе из (7).
Получают .ТипВсеСсылки() всех менеджеров ссылочных типов.
user1932344; О.Ж; begemot; гвость; ITEkb; dmitriy_saladin; +6 Ответить
22. Merkalov 8 11.11.22 10:54 Сейчас в теме
ТипЗначенияСтрокой = XMLТипЗнч(Документ).ИмяТипа;
ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
23. it-service 19.04.23 17:50 Сейчас в теме
ТипЗнч(Параметр) = Тип("ДокументСсылка." + Параметр.Метаданные().Имя)
24. itmind 310 11.08.23 02:17 Сейчас в теме
Обобщу.

Три способа:
ПоСсылке1 = ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Параметр)); //из БСП
ПоСсылке2 = ТипЗнч(Параметр)= Тип("ДокументСсылка."+Параметр.Метаданные().Имя);
ПоСсылке3 = СтрНайти(XMLТипЗнч(Параметр).ИмяТипа,"DocumentRef")>0;

По замеру производительности самый быстрый - первый, самый медленный второй.
25. PowerBoy 3364 11.08.23 08:43 Сейчас в теме
(24) По первому способу Документы из расширений в пролете.
26. Sashares 34 11.08.23 09:45 Сейчас в теме
(25)В актуальной версии платформы должно работать уже.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот