Имя: Пароль:
1C
1С v8
Как использовать ЗначениеЗаполнено для <объект не найден>?
,
0 ИС-2
 
naïve
07.04.14
14:50
Загрузка данных от поставщика. Какой код Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИДКонтрагента));

функция ЗначениеЗаполнено для <оюъект не найден> возвращает истину.
Какие есть нормальные способы, чтобы обрабатывались, только действительно заполненные контрагенты?
Как определить, что существует ссылка с этим ГУИДом или нет?

Проверять по заполнению кода/наименования не хочу, по наличию текста <объект не найден> тоже
1 Heckfy
 
07.04.14
14:51
ПустаяСсылка() ??
2 Heckfy
 
07.04.14
14:51
ЕСТЬ NULL ??
3 Зойч
 
07.04.14
14:52
в типовых на бсп есть функция ОбъектСуществует
4 Fram
 
07.04.14
14:52
ПолучитьОбъект() = Неопределено
5 ИС-2
 
naïve
07.04.14
14:59
(1) <объект не найден> = .пустаяссылка() и ВасяПукин = .пустаяссылка() вернет одно и тоже значение
(2) речь по код, а не запрос
(3) скиньте, пжс, код
(4) доооолго будет работать
6 Maxus43
 
07.04.14
15:01
(5) запрос, не изобретай велосипед. Такой запрос быстро отработает
7 х86
 
07.04.14
15:01
(0)У ссылки смотри пометку удаления
8 Maxus43
 
07.04.14
15:02
всмысле "Выбрать Ссылка Из Справочник.Контрагенты Где Ссылка = &ТвойОбъектНеНайден"
9 Зойч
 
07.04.14
15:02
Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт
    
    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    Ссылка КАК Ссылка
    |ИЗ
    |    [ИмяТаблицы]
    |ГДЕ
    |    Ссылка = &Ссылка
    |";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка));
    
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка);
    
    УстановитьПривилегированныйРежим(Истина);
    
    Возврат НЕ Запрос.Выполнить().Пустой();
    
КонецФункции
10 Зойч
 
07.04.14
15:03
Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт
    
    Возврат Ссылка.Метаданные().ПолноеИмя();
    
КонецФункции
11 ИС-2
 
naïve
07.04.14
15:24
(6) и какое преимущество у запроса перед ЗначениеЗаполнено(Контр.Код)
(7) она всегда будет равна ложь
12 ИС-2
 
naïve
07.04.14
15:25
(9) спасибо. Только это что из пушки по мухам бить или как там...
13 х86
 
07.04.14
15:25
(11)п2. уверен?
14 Vladuha
 
07.04.14
15:29
еще не было? http://kb.mista.ru/article.php?id=21
15 banco
 
07.04.14
15:35
(7)  Контр.Код = пусто еще не означает что объект не существует. нормальный вариант в (4)
16 Kyon8
 
07.04.14
15:35
(11) Контр.Код подтянет и закеширует все реквизиты объекта, так что в БСП всё правильно. Плюс контрагент может быть без кода (через обмен данными криво загрузился, например).
17 Torquader
 
07.04.14
15:44
Нет, а что такого страшного в битых ссылках ?
Просто в одной таблице есть запись, которой нет в другой таблице - для самой базы данных это не критично.
И проверить ссылку на небитость можно только обращением в основную таблицу объекта - нужно, всего лишь, узнать - есть ли там запись с таким UID или нет.
Так что в (9) всё просто и понятно написано - можно, конечно, выбирать не ссылку, а количество записей, чтобы не было никаких потугов с загрузкой представления для ссылки (но оно-то всё равно будет загружено ещё до начала исполнения запроса, так как ссылка у нас).
18 Юрий Юрьевич
 
07.04.14
15:58
Найти(Строка(ЗначениеДляКоторогоОбъектНеНайден),"Объект не найден")<>0
19 Юрий Юрьевич
 
07.04.14
15:59
Даже если не хочется, придется себя заставить
20 Maxus43
 
07.04.14
16:03
(19) за такое сама фирма 1с при аудите кода бъёт по филейной части авторов
21 oleg_km
 
07.04.14
17:13
(20) А что, сама 1С предусмотрела однозначный механизм выявления таких ссылок? Т.е. есть константа, функция или метод, с помощью который документированным способом определить, что это ссылка на объект, который отсутствует в базе? Так 1С сама хороша в таком случае. Я бы ее тоже бы приложил за такое.
22 H A D G E H O G s
 
07.04.14
17:15
(21) Как бы сделал ты?
23 oleg_km
 
07.04.14
18:00
(22) На месте 1С? Я же написал: сделал бы или литерал или функцию глобального контекста, либо метод ссылки или менеджера. А как сделала 1С? Может мне прост неведомо сакральное знание и где-то в методичках есть рекомендованный 1С способ?
24 Леша1с
 
07.04.14
18:02
У 1С не существует такого объекта "объект не найден".
Поэтому она его и не обрабатывает никак.
Нет сущности - нет проблемы.
25 Адинэснег
 
07.04.14
18:07
зачем искать оптимальные способы поиска битых ссылок?
Они неслучайно там появились, лучше уделите время выяснения причины, каким образом в вашей системе нарушается ссылочная целостность
26 H A D G E H O G s
 
07.04.14
18:07
(23) Зачем? Есть же запрос.
27 Адинэснег
 
07.04.14
18:12
(12) соедини с таблицей, в которой ищешь битые ссылки и будет один запрос.
28 Адинэснег
 
07.04.14
18:16
типа
ВЫБРАТЬ РАЗЛИЧНЫЕ
    РеализацияТоваровУслуг.ДоговорКонтрагента
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        ПО РеализацияТоваровУслуг.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка
ГДЕ
    ДоговорыКонтрагентов.Ссылка ЕСТЬ NULL
29 Torquader
 
08.04.14
00:29
(21)(23) Вопрос в том, что битая ссылка определяется только в момент, когда её читаем, так как ни 1С ни SQL вообще не знает о том, что там с объектом в его основной таблицы.
30 H A D G E H O G s
 
08.04.14
00:43
(29) В SQL есть foreign key для контроля этого дела, другой вопрос в том, что 1С это не использует, ибо, например, при загрузке из XML все встанет раком.
31 Torquader
 
08.04.14
00:47
(30) Ну, foreign key просто ставится в ноль, если удаляется основная запись.

Раком, конечно, не встанет, но всю загрузку нужно будет делать в одной транзакции.

И, очень печальный случай - загрузка двух объектов, ссылающихся друг на друга - если делать честно, то сначала грузим объекты с пустыми ссылками, а потом добавляем к ним ссылки.
32 H A D G E H O G s
 
08.04.14
00:51
(31) Насколько я помню, sql генерирует исключение при попытке удаления основной записи
33 Torquader
 
08.04.14
20:07
(32) Это как настроишь - можно и CASCADE (то есть удалить и дочерние автоматом), а можно их просто в Null сбросить.
2 + 2 = 3.9999999999999999999999999999999...