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

1. Kutuzov 737 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 737 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 737 21.01.14 12:26 Сейчас в теме
(2) fnxash, нельзя через точку обращаться, это снижает быстродействие.
4. ZergKRSK 129 21.01.14 11:35 Сейчас в теме
А передавать в ф-цию только ссылку или только объект не судьба?
13. Kutuzov 737 21.01.14 12:28 Сейчас в теме
(4) ZergKRSK, если код обработки ссылки и объекта примерно одинаковый, то не судьба.
6. mrmasson 57 21.01.14 11:54 Сейчас в теме
Можно сделать проверку следующим образом (Работает для всех документов(!)):
Если ТипЗнч(Первый) = Тип("ДокументСсылка."+ТипЗнч(Первый)) Тогда
//ссылка
...
ИначеЕсли ТипЗнч(Первый) = Тип("ДокументОбъект."+ТипЗнч(Первый)) Тогда
//объект
.....
КонецЕсли;
Показать
10. Kutuzov 737 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 6431 13.08.21 00:35 Сейчас в теме
Искал ответ на этот же вопрос. Почитал... Что-то все не понравилось. А так не пойдет?

Если Док.Ссылка = Док Тогда
// Док - это ссылка
Иначе
// Док - это объект
КонецЕсли;
20. O-Planet 6431 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 308 11.08.23 02:17 Сейчас в теме
Обобщу.

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

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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)