|
Как использовать ЗначениеЗаполнено для <объект не найден>? | ☑ | ||
---|---|---|---|---|
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 сбросить.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |