Как определить программно ссылка битая или нет ?
Нужно определить ссылка битая или нет, и не хочется использовать конструкцию попытка исключение.
Как определить программно, ссылка битая или нет ?
По теме из базы знаний
- Программные перечисления, ч.2: приемы кэширования при разработке
- Как формируется GUID?
- Как стать матерым штурмовиком, или истории из жизни
- WEB-интерфейсы как механизм сбора и контроля данных в розничной сети. Инструменты и наработки
- Мастер-класс SonarQube. В омут с головой
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
9. Поручик 4661 29.08.12 11:01 Сейчас в теме
(1) В БСП есть функция
// Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки // // Параметры: // ЛюбаяСсылка - значение любой ссылки информационной базы данных // // Возвращаемое значение: // Истина - ссылка физически существует; // Ложь - ссылка физически не существует // Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт ТекстЗапроса = " |ВЫБРАТЬ | Ссылка |ИЗ | [ИмяТаблицы] |ГДЕ | Ссылка = &Ссылка |"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка)); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка); УстановитьПривилегированныйРежим(Истина); Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции
Рамзес; hityay; FilatovRA; exclusive; syurev; user1716460; ghostaz; sumpavig; Andy_NTG; akocur; alsegor; pioneeer; jobkostya1c_ERP; simuljakr; Student1C; Gendelf; Merkalov; vv2; LordKim; Lacoste4life; RomanKod; Sarkikker; Andrei_Ivanov; houpl; user1232941; Fales; v3n7; unknown181538; GonziK_KIV; malikov_pro; Jivchic; ram3; TeMochkiN; maxunov95; improg; kimskiysanya; mickey.1cx; Batman; zfr475; user659168_xec8787; anchovy; 7OH; treedo; McLer; Alien_job; 1v7; rusmil; adhocprog; serezhenko; Gladkov_Anton; azazana; gaspard; alex-l19041; Патриот; Kesak; HEKPOH; Dr.ZIG; keypax; + 58 – Ответить
10. nodalt 9 29.08.12 11:13 Сейчас в теме
(9) Вопрос . ИмяТаблицыПоСсылке(ЛюбаяСсылка) — это что за функция? Каким образом она возвращает имя таблицы? Это же не встроенная процедура или функция.
11. ksb 29.08.12 11:15 Сейчас в теме
// Возвращает полное имя объекта метаданных по переданному значению ссылки // Например, // "Справочник.Номенклатура"; // "Документ.ПриходнаяНакладная" // // Параметры: // Ссылка - ЛюбаяСсылка - значение ссылки, для которого необходимо получить имя таблицы ИБ // // Возвращаемое значение: // Строка - полное имя объекта метаданных для указанного значения ссылки // Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт Возврат Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя(); КонецФункции
user1716460; sumpavig; jobkostya1c_ERP; RomanKod; maxunov95; zfr475; drygina; McLer; 1v7; adhocprog; rayastar; Патриот; nodalt; + 13 – Ответить
29. improg 539 31.08.19 12:20 Сейчас в теме
(9) Да быстрее чем получитьОбъект().
2. Ntari 29.08.12 07:34 Сейчас в теме
если ссылка.ПолучитьОбъект()=неопределено тогда
simuljakr; RomanKod; Meson; vlm88; olololeg; Rustavelli; Hamsik; Восьмой; adhocprog; + 9 – Ответить
3. Rudakov_D 222 29.08.12 07:34 Сейчас в теме
Похоже ничего лучше чем
Если БИТАЯССЫЛКА.ПолучитьОбъект() = Неопределено тогда
chemezov; RomanKod; + 2 – Ответить
5. Ntari 29.08.12 07:51 Сейчас в теме
(3) Arch_1,
Похоже ничего лучше чем
Если БИТАЯССЫЛКА.ПолучитьОбъект() = Неопределено тогда
уже не найти.
в любом случае, чтобы определить битая ссылка или нет необходимо попытаться «пройти» по этой ссылке
4. ksb 29.08.12 07:35 Сейчас в теме
Думаю как вариант банально анализировать представление формируемое платформой 1С
Ссылка = Реквизит1.Родитель; Если Найти(Строка(Ссылка), " (" ) <> 0 тогда Сообщить("Ссылка битая"); Иначе Сообщить("Ссылка НЕ битая"); КонецЕсли;
simuljakr; DoctorRoot; magiceagle; user1502168; adhocprog; _OVEN_; pbahushevich; + 7 – 1 Ответить
13. for_sale 956 14.10.16 20:43 Сейчас в теме
(4) ksb, just for lulz:
НовЭл = Справочники.Справочник.СоздатьЭлемент(); НовЭл.Наименование = "Сейчас мы ( поломаем систему"; НовЭл.Записать(); Ссылка = НовЭл.Ссылка; Если Найти(Строка(Ссылка), " (" ) <> 0 тогда Сообщить("Ссылка битая"); Иначе Сообщить("Эта ветка нам не понадобится, можно её удалить"); КонецЕсли;
Lacoste4life; TreeDogNight; Brawler; leaguener; CnupT; fst; CyberCerber; 7OH; adhocprog; temdj; + 10 – 2 Ответить
15. &rew 49 05.11.16 21:11 Сейчас в теме
(13) Блин, хоть ветка старая, но. Чуваки и чувихи, которые ищут объекты не найденные скорее всего это делают относительно не часто, и вряд ли им попадется маньяк, который так будет делать. Понимаю что учитывать надо, но ровно с той же вероятностью, даже кстати меньшей, чем то что конфа будет в режиме совместимости с 8.3.5 и ниже. «Найти» там, вся фигня.
sinichenko_alex; insurgut; + 2 – Ответить
42. MegasXXX 2 02.11.22 18:47 Сейчас в теме
(4)
Найти дольше чем простейшее, для документов:
Лев(Ссылка, 1) = "
Для справочников лучше брать больше 1 символа, вдруг кто наименование напишет "" 43. user1863362 02.11.22 20:35 Сейчас в теме(42) Открой уже для себя существование ОбработкаПолученияПредставления для того же документа. После открытия подумай еще раз над своим предложением.
6. Rudakov_D 222 29.08.12 08:22 Сейчас в теме Еще есть вариант запроса, и он будет вероятно быстрее работать. 7. Ntari 29.08.12 09:03 Сейчас в теме(6) Arch_1,
8. andrewks 1365 29.08.12 10:54 Сейчас в теме (7) AntonBaikal,
Еще есть вариант запроса, и он будет вероятно быстрее работать.
наврядли..одинаково отработают. но запрос или ПолучитьОБъект() это уже на выбор автора))
наврядли..одинаково отработаютне думаю. попробуйте считать большой документ с кучей реквизитов и данных в ТЧ, а затем сравните с запросом
12. Ntari 29.08.12 11:28 Сейчас в теме (8) andrewks, про документы как то не подумал) 22. Hobbit_Jedi 13.11.17 16:56 Сейчас в теме(12) Простите, что "оживляю" мертвую ветку.
Windsor77; TreeDogNight; hawkmax; jobkostya1c_ERP; + 4 – 1 Ответить 14. maks_20 163 21.10.16 19:57 Сейчас в теме В запросе условием что-то типа такого: Где Номенклатура.Ссылка ЕСТЬ NULL 16. EMelihoff 07.11.16 12:40 Сейчас в теме Я ищу запросом:
Только что наступил на еще одну граблю в пользу запроса (из функции СсылкаСуществует) против Ссылка.ПолучитьОбъект() = Неопределено.
Получение объекта, кроме зачитывания из БД кучи табличных частей и движений документа, еще и выполняет код инициализации модуля объекта. А некоторые доброжелатели (из разработчиков типовых конфигураций) там ТАКИХ сюрпризов наоставлять могут, что вся производительность в ноль уйдет.Ссылка.Код IS NULLrad1st; kivals; kokstik; + 3 – Ответить
17. PlatonStepan 38 09.11.16 18:59 Сейчас в темеИзвиняюсь за некропост, но с некоторой версии платформы появился встроенный реквизит ссылочного объекта "ВерсияДанных", который заполняется системой в момент записи объекта. Значит если объекта нет, то это значение будет не заполнено.
ЭтоБитаяСсылка = ПустаяСтрока(Ссылка.ВерсияДанных);Igor_Ryaboff; kladovoy; user892471; kabantus; marku; pvlunegov; TreeDogNight; zhuntovda; Jivchic; anchovy; Enya_06; falsepilot; + 12 – Ответить
18. корум 287 10.11.16 10:12 Сейчас в теме
(17) некро это полгода, год, три. 🙂
19. for_sale 956 05.12.16 14:51 Сейчас в теме(17), с тем же успехом можно проверить любой другой реквизит Ссылки.
И ПустаяСтрока - это не комильфо, НЕ ЗначениеЗаполнено работает быстрее.
20. fromtomike 49 05.12.16 15:27 Сейчас в теме
А почему не так ?
Для документа: Если СокрЛП(Ссылка.Номер) = "" Тогда . КонецЕсли; Для справочника (если длина кода в конфигураторе <> 0): Если СокрЛП(Ссылка.Номер) = "" Тогда . КонецЕсли;23. Hobbit_Jedi 13.11.17 22:21 Сейчас в теме
(20) Замеры показывают, что Ссылка.ВерсияДанных, Ссылка.Номер, Ссылка.ЛюбойРеквизит - выполняются по времени соизмеримо с Ссылка.ПолучитьОбъект().
И это правильно, т.к. если вспоминать мат. часть, то выяснится, что для получения реквизита через точку, платформа зачитывает в память весь объект, со всеми табличными частями и движениями (если это документ), и получает от него реквизит. И кстати, сам объект какое-то время висит в кэш-памяти - на случай, если надо будет от него через точку еще какие-нибудь реквизиты получать.
Посему вывод: функция СсылкаСуществует - самый быстрый способ проверки (особенно если еще и саму функцию в кэшируемый модуль поместить).kirinalex; PlatonStepan; + 2 – 1 Ответить
21. aap290680 05.12.16 15:45 Сейчас в темев запросе однозначно лучше всего и проверено, например проверить документы с битой ссылкой на контрагент: Документ.Контрагент.Ссылка ЕСТЬ NULL обязательно надо добавлять .Ссылка чтобы там NULL получился у битой ссылке.
24. jobkostya1c_ERP 100 09.01.18 09:56 Сейчас в теме
А не подскажете как проверить что по COM-соединению битая ссылка? Чтоб оптимально было. Столкнулся например что группа справочника в базе-источнике это битая ссылка
25. Xershi 1442 09.01.18 10:13 Сейчас в теме
(24) запросом в стиле ком.
jobkostya1c_ERP; + 1 – Ответить
26. jobkostya1c_ERP 100 09.01.18 10:22 Сейчас в теме
(25)Спасибо, туплю в первый день. Там же и проверять по КОМ.
27. Омский Домовой 408 25.08.19 22:03 Сейчас в темеКак выяснилось эксперементальным путем для проверки на "Объект не найден" быстрее работает конструкция
Отказ = СтрНайти(Строка(БитаяСсылка),"") > 0;Отказ = БитаяСсылка.ПолучитьОбъект() = Неопределено;Применял в конвертации данных на стадии выгрузки набора движений документа на очень больших объемах данных где в единичных случаях попадались битые ссылки и процесс прерывался.
Через COM такой подход тоже будет работать только типа
СтрНайти(Соединение.Строка(БитаяСсылка),"")ANF-BR; user686589_sev_s; + 2 – Ответить
28. Xershi 1442 25.08.19 22:16 Сейчас в теме(27) конечно быстрее. Получить объект это тяжелая операция, а сравнение строки легкая. Но тяжелая операция гарантированный результат. А поиск по строке с вероятностью не даст результат. Как поломать этот алгоритм уже писали.
37. ANF-BR 05.09.22 06:50 Сейчас в теме
Отказ = СтрНайти(Строка(БитаяСсылка),"<Объект не найден>") > 0;Объект>
38. SlavaKron 05.09.22 10:47 Сейчас в теме(37) Это не самое оптимальное решение.
Очевидно же, что единственный нативный способ проверить существование объекта – это запрос:Запрос = Новый Запрос("ВЫБРАТЬ NULL ИЗ Справочник.МойСправочник ГДЕ Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", БитаяСсылка); СсылкаБитая = Запрос.Выполнить().Пустой();Ничего быстрее вы не придумаете.
40. ANF-BR 05.09.22 13:21 Сейчас в теме(39)
(38)
Мне кажется простое сравнение строки гораздо быстрее любой выборки, ну ладно, попробую ради эксперимента41. Fox-trot 153 05.09.22 14:52 Сейчас в теме
(40) таки да, но ведь в нашем случае сравнение не "простое"
39. Fox-trot 153 05.09.22 12:31 Сейчас в теме
(37) для продвинутых
30. mialord 18.03.20 18:50 Сейчас в теме
Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ, "Ссылка") = Неопределено Тогда // сгенерирована ссылка без описания объекта ТекстСообщения = СтрШаблон(НСтр("ru = 'Не обработана строка фабрики XDTO ReturnFlow: |Не обнаружена заявка на закупку с идентификатором %1'"), UUID); ВызватьИсключение ТекстСообщения; КонецЕсли;31. user645820_victor80vh 05.06.20 00:41 Сейчас в теме
// Проверка существует ли объект по ссылке Функция СсылкаСуществует(СсылкаНаОбъект) Запрос = Новый Запрос("Выбрать Таб.Ссылка ИЗ "+СтрЗаменить(СериализаторXDTO.XMLТипЗнч(СсылкаНаОбъект).ИмяТипа,"Ref.",".") +" КАК Таб ГДЕ Таб.Ссылка = &СсылкаНаОбъект"); Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект); Результат = Запрос.Выполнить(); Возврат НЕ Результат.Пустой(); КонецФункцииvv2; japopov; akkorn; + 3 – Ответить
33. akkorn 23.07.21 09:37 Сейчас в темеЗапрос = Новый Запрос("Выбрать Таб.Ссылка ИЗ "+СтрЗаменить(СериализаторXDTO.XMLТипЗнч(СсылкаНаОбъект).ИмяТипа,"Ref.",".") +" КАК Таб ГДЕ Таб.Ссылка = &СсылкаНаОбъект");
Совершенно согласен с подходом. Поясню.
Здесь много говорили о производительности. И запросом ссылку проверять быстрее и правильнее, не загружая объект в память.
Однако, ни кто не обратил внимание на составную функции СсылкаСуществует()
Там используется другая функция ИмяТаблицыПоСсылке(), которая берет Метаданные() объекта.Замерил, - это примерно 10 раз медленнее чем XMLТипЗнч() (на цикле в 10000).
Проверить может каждый. Замер времени делал просто - обернул код вызова ТекущаяУниверсальнаяДатаВМиллисекундах() и узнал разницу.Да, XMLТипЗнч() изменяет описание объекта. Вместо "Справочник.Номенклатура" она возвращает "CatalogRef.Номенклатура", поэтому приходится использовать дополнительно СтрЗаменить(). Для запроса не играет роли как мы обзываем тип объекта, - "Catalog." или "Справочник.".
Поэтому переписал функцию. Мне же потом и пригодится. Помещу здесь новый вариант:
&НаСервере Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт //ИмяТаблицы = Метаданные.НайтиПоТипу(ТипЗнч(ЛюбаяСсылка)).ПолноеИмя(); // взять Метаданные() в 10 раз медленнее чем XMLТипЗнч(..) ИмяТаблицы = СтрЗаменить(СериализаторXDTO.XMLТипЗнч(ЛюбаяСсылка).ИмяТипа, "Ref.", "."); ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка ИЗ [ИмяТаблицы] ГДЕ Ссылка = &Ссылка"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицы); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка); УстановитьПривилегированныйРежим(Истина); Результ = НЕ Запрос.Выполнить().Пустой(); УстановитьПривилегированныйРежим(Ложь); Возврат Результ; КонецФункцииzlexuzz; evgaid; vv2; AndrewKop; mc1c; salbey; user1233797; eufes; EvgeTrofi; japopov; + 10 – Ответить
1с как определить битую ссылку
Хотел бы к статье из книги знаний Книга знаний: v8: Пустые ссылки добавить свою функцию определения битой ссылки http://infostart.ru/blogs/1241/
способ определения битой ссылки через Ссылка.ПолучитьОбъект() очень медленный;
через Найти(Строка(Ссылка),"") <> 0 - некорректный (на мой взгляд),
поэтому представляю на Ваш суд функцию, позволяющую быстро определить битая ссылка или нет.
Функция ОбъектБДСуществует(ТестоваяСсылка) Экспорт
МД = Метаданные.НайтиПоТипу(ТипЗнч(ТестоваяСсылка));
ИмяОбъекта = МД.Имя;
ПолноеИмяОбъекта = МД.ПолноеИмя();Запрос = новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| " + ИмяОбъекта + ".Ссылка КАК СсылкаБД
|ИЗ
| " + ПолноеИмяОбъекта + " КАК " + ИмяОбъекта + "
|ГДЕ
| " + ИмяОбъекта + ".Ссылка = &Cсылка";
Запрос.УстановитьПараметр("Cсылка", ТестоваяСсылка);
РезультатЗапроса = Запрос.Выполнить();Возврат Не РезультатЗапроса.Пустой();
При желании можно добавить какой-нибудь кеш для текстов запросов по полному имени объекта, но не думаю,
что это сильно ускорит работу данной функции, она и без того быстро отрабатывает.
Как в запросе отобрать битые ссылки, поиск Битых Ссылок
Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом: (16:bca8000c6efdd52111d8eaba7c9706eb)
Битая ссылка не является пустой. Т.е. метод Пустая() возвращает Ложь. Определить, что ссылка битая можно так:
Код 1C v 8.хЕсли Ссылка.ПолучитьОбъект() = Неопределено Тогда
//битая ссылка
КонецЕсли;
// или так (НО ненадежно):
Если Лев(СокрЛП(Ссылка),18) = "" ТогдаКод 1C v 8.х
// Еще вариант (действует для обьектов, которые имеют ссылку)
Попытка
обьект=Ссылка.Ссылка;
Исключение
сообщить("битая");
КонецПопытки;И последний вариант для проверки в запросах:
ГДЕ Объект.РеквизитОбъекта ЕСТЬ NULL И Не Объект=&ПустаяСсылкаОбъектаНиже дана программа для удаления записей регистров, у которых регистратор - битая ссылка, т.е. не существует в базе.
Процедура УдалениеБитыхСсылок(ИмяРегистра,ТипРегистра,ТипРегистраЗ)
МенеджерРегистра = ТипРегистра[ИмяРегистра];
Запрос = Новый Запрос("
|ВЫБРАТЬ Регистратор
|ИЗ "+ТипРегистраЗ+"."+ИмяРегистра+"
|ГДЕ Регистратор.Ссылка ЕСТЬ NULL И НЕ Регистратор = &ПустаяСсылкаДокумента");
Запрос.УстановитьПараметр("ПустаяСсылкаДокумента",Неопределено);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = ТипРегистра[ИмяРегистра].СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Записать();
ОбработкаПрерыванияПользователя();
Состояние(""+ТипРегистра+" "+ИмяРегистра);
КонецЦикла;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
Для Каждого пРегистр из Метаданные.РегистрыСведений Цикл
Подчинен = (пРегистр.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору);
Если Подчинен Тогда
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыСведений,"РегистрСведений")
КонецЕсли;
КонецЦикла;
Для Каждого пРегистр из Метаданные.РегистрыБухгалтерии Цикл
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыБухгалтерии,"РегистрБухгалтерии")
КонецЦикла;
Для Каждого пРегистр из Метаданные.РегистрыРасчета Цикл
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыРасчета,"РегистрРасчета")
КонецЦикла;
Для Каждого пРегистр из Метаданные.РегистрыНакопления Цикл
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыНакопления,"РегистрНакопления")
КонецЦикла;
КонецПроцедурыПоиск битых ссылок
В результате некорректных загрузок из других информационных баз или удаления объектов без контроля ссылочной целостности в базе 1С могут появляться так называемые «битые ссылки» — ссылки на объекты, которых нет в базе. 1С:Предприятие обладает средствами выявления таких некорректных ссылок.
Битые ссылки глазами пользователя
В режиме предприятия битые ссылки выглядят так:
Внимание!
Следует учесть, что такую же «картинку» пользователь может увидеть и в случае некорректно настроенных ролей.
Ниже описано несколько способов поиска некорректных ссылок на объекты.
Сервис «Тестирование и исправление информационной базы»
Для открытия окна настройки проверки необходимо в конфигураторе выбрать пункт меню Администрирование > Тестирование и исправление.
В открывшемся окне устанавливаем флаг «Проверка ссылочной целостности информационной базы». Данная проверка выполняется только совместно с проверкой логической целостности информационной базы.
Далее выбираем что необходимо сделать при обнаружении битых ссылок:
- Только тестирование — после анализа будет отображен перечень некорректных ссылок;
- Тестирование и исправление — можно не только получить перечень некорректных ссылок, но и исправить их: очистить некорректную ссылку или создать объект, соответствующий некорректной ссылке.
Следует иметь в виду, что проверка ссылочной целостности выполняется в монопольном режиме, а значит работа пользователей в это время невозможна.
В больших базах процесс поиска битых ссылок может занять достаточно длительное время, и не уложиться в интервал технологического перерыва. Из-за этого в нижней части окна предусмотрена возможность порционного выполнения.
Программный поиск битых ссылок
Программный поиск битых ссылок обладает одним несомненным преимуществом: нет необходимости устанавливать монопольный режим и ограничивать доступ пользователей к базе.
Фирма 1С не предоставляет какой-то универсальной обработки для поиска битых ссылок в пользовательском режиме, поэтому придется «творить» самому. Вот несколько подходов, которые можно использовать:
- Получение в запросе подчиненного реквизита и сравнение его с NULL . В качестве подчиненного реквизита наиболее рационально использовать ссылку — она есть у всех объектов. В запросе также необходимо учесть, что подчиненный реквизит от пустой ссылки также возвращает NULL .
- Получение объекта от ссылки при помощи метода ПолучитьОбъект () . Если ссылка битая, то будет возвращено значение Неопределено .
- Получение представления ссылочного типа и сравнение его со строкой «» .
// ***** Поиск битых ссылок при помощи запроса *****
Запрос = Новый Запрос ;
Запрос . Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Контрагент
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
| И ПоступлениеТоваровУслуг.Контрагент.Ссылка ЕСТЬ NULL" ;
// ***** Определение корректности ссылки при помощи метода ПолучитьОбъект() *****
Если ЗначениеЗаполнено ( Док . Контрагент ) И Док . Контрагент . ПолучитьОбъект () = Неопределено Тогда
// Значение реквизита Контрагент - битая ссылка
КонецЕсли;
// ***** Определение корректности ссылки путем анализа представления *****
Если Найти ( Строка ( Док . Контрагент ), "" ) > 0 Тогда
// Значение реквизита Контрагент - битая ссылка
КонецЕсли;

