|
Проверить заполненность ссылки Com-объекта, существует ли она? | ☑ | ||
---|---|---|---|---|
0
Mikhail Volkov
18.09.20
✎
07:22
|
Обычно все объекты двух баз синхронизированы по GUID. Поэтому, когда мне нужен объект из другой базы, по Com-соединению обращаюсь в первую очередь по GUID, получаю (формирую) из нее ссылку COMОбъект. Надо проверить не пустая ли она. Как? Желательно типовым методом.
|
|||
1
Kigo_Kigo
18.09.20
✎
07:31
|
ЗначениеЗаполнено(КомСоеденение.ПолучитьОбъектПоИдентификатору(GUID)) не?
|
|||
2
Mikhail Volkov
18.09.20
✎
08:03
|
(1) Сомневаюсь, что ЗначениеЗаполнено(COMОбъект) правильно проверит, ведь ComСоеденение правильно передает только числа, строки, даты...
Например, для документа: GUID = Документ.УникальныйИдентификатор(); GUIDCom = ComСоеденение.NewObject("УникальныйИдентификатор", Строка(GUID)); СсылкаCom = ComСоеденение.Документы[ВидДокументаCom].ПолучитьСсылку(GUIDCom); СсылкаCom тоже COMОбъект. Как ее проверить? |
|||
3
Kigo_Kigo
18.09.20
✎
08:05
|
(2) Комобъект, при получить объект, объект либо получен- если он есть, либо нет, так что по идее либо бутет пустое значение, либо нет, по крайней мере для изменения данных я так получаю объекты и работаю с ними
|
|||
4
Mikhail Volkov
18.09.20
✎
08:21
|
(3) Наверное правильнее так: КомСоеденение.ЗначениеЗаполнено(ПолучитьОбъектПоИдентификатору(GUID))?
|
|||
5
Kigo_Kigo
18.09.20
✎
10:20
|
(4) Странная конструкция
|
|||
6
ManyakRus
18.09.20
✎
10:25
|
ComСоеденение.ЗначениеЗаполнено(Документ)
|
|||
7
acht
18.09.20
✎
10:30
|
(0) Ты определись, чего хочешь - проверки на пустоту ссылки или существования в базе, подключенной по COM объекта с такой ссылкой?
|
|||
8
acht
18.09.20
✎
10:34
|
Если первое, то метод Пустая() весьма хорошо работает. Если второе - то пишешь в подключенной базе запрос на выборку объекта с такой ссылкой и проверяешь результат на пустоту. Параметр-ссылку конструируешь в подключенной базе через ПолучитьСсылку() и создание там же уникального идентификтора по строке со своей стороны.
|
|||
9
lodger
18.09.20
✎
10:41
|
(8) "то метод Пустая() весьма хорошо работает" - да?
а зачем тогда посоны кипишь поднимают? Проверка объекта, полученного по Уникальному идентификатору |
|||
10
Mikhail Volkov
18.09.20
✎
11:33
|
(7) Наверное второе: нужно найти ссылку на этот же объект в другой базе, подключенной по Com-соединению. Сперва по GUID, если не найден (не существует такой ссылки, пустая), то наименованию, коду, или номеру и дате документа...
Фрагмент кода в (2) написан еще до меня, предыдущим программистом. Далее он проверяет: ЗначениеЗаполнено(СсылкаCom.DataVersion). Но у меня возникло сомнение: всегда ли заполнено DataVersion (если ссылка все же существует) числом или строкой, передающееся по Com-соединению? Существуют ли другие, типовые методы проверки ссылки? |
|||
11
CaIIIka
18.09.20
✎
11:38
|
(8) В локали пустая далеко не всегда работает. Нужно на "Ссылка.ПолучитьОбъект() = Неопределено" проверять.
|
|||
12
CaIIIka
18.09.20
✎
11:39
|
(9) не заметил )
|
|||
13
lodger
18.09.20
✎
12:24
|
(10) чтобы помацать DataVersion, будет загружен объект по ссылке.
если ты это делаешь в цикле или не собираешься использовать данные объекта в пределах текущей процедуры - то это такой себе костыль. как и (11) чтобы минимизировать поток данных надо собрать все такие ссылки в кучку и отправить в запрос. в запросе "выбрать ссылка из документ.имядокумента где ссылка в (&кучкассылок)". результатом будет выборка ссылок существующих в этой бд. дальше уже как-то обработаешь. |
|||
14
Вафель
18.09.20
✎
17:16
|
в бсп есть функция про проверке ссылкасуществует
|
|||
15
acht
18.09.20
✎
17:19
|
(9) Потому что не отличают пустую ссылку от ссылки, отсутвующей в информационной базе. Как и ты.
|
|||
16
Mikhail Volkov
18.09.20
✎
18:03
|
Проверка: СсылкаCom.ПолучитьОбъект() <> Неопределено ошибку дает (выпадает из Попытки) не после поиска по GUID, а после поиска по номеру. При поверки: ЗначениеЗаполнено(СсылкаCom.DataVersion) ошибок нет.
Кстати, НайтиПоНомеру() возвращает пустую ссылку, если документ не найден. А через Com-соединение COMОбъект. Вопрос не в этом, существуют ли другие методы проверки существования ссылки через Com-соединение? |
|||
17
youalex
18.09.20
✎
18:12
|
"заполненность ссылки Com-объекта" и "существует ли она" - это разные ситуации.
В БСП есть ОбщегоНазначения.СсылкаСуществует(). Понятно, вызывать ее нужно в контексте com. |
|||
18
Mikhail Volkov
19.09.20
✎
09:12
|
(17) > вызывать ее нужно в контексте com.
Идея вроде верная, но сложная... Сперва нужно проверить существует ли ссылка в другой базе: СсылкаComСуществует = ComСоеденение.ОбщегоНазначения.СсылкаСуществует(Документы[ВидДокументаCom].ПолучитьСсылку(GUIDCom)); И если существует, получать и использовать ее. > "заполненность ссылки Com-объекта" и "существует ли она" - это разные ситуации. В данном случае: если ссылка не существует, то она не заполнена. Пока проверяется лишь по заполненности поля СсылкаCom.DataVersion. Но возникли сомнения: не знаю его тип: число, строка или еще что-нибудь - всегда ли передается через Com-соединение? Или ссылка есть, DataVersion пустое? |
|||
19
youalex
19.09.20
✎
18:19
|
(18) Незаполненная ссылка - это ссылка пустая, одноименный метод ТвояСсылка.Пустая(), ссылка с нулевым гуидом.
Можно проверить собственно, методом ссылки Пустая(), или если у тебя есть идентификатор, можно сразу проверить его через ЗначениеЗаполнено(), понятно, проверять нужно сам уник. идентификатор Ссылка не существует - это значит что нет объекта в базе по этой ссылке. Пустые ссылки, естественно, тоже не существуют. Когда ты получаешь через точку DataVersion (оно же ВерсияДанных) ты неявно получаешь весь объект из БД (если его нет в кэше). Т.е фактически СсылкаCom.ПолучитьОбъект().DataVersion. Метод ОбщегоНазначения.СсылкаСуществует() - в общем случае более оптимальный, т.к. не тащит все данные объекта, а делает ровно то, зачем и нужен - проверяет есть ли ссылка в базе. |
|||
20
youalex
19.09.20
✎
18:20
|
Собственно, об этом уже писали выше, в (13) например)
|
|||
21
Casey1984
19.09.20
✎
20:52
|
(17) + плюсую
|
|||
22
Mikhail Volkov
20.09.20
✎
08:55
|
(19) Просьба уточнить "в общем случае более оптимальный".
Фрагмент (2) писался давно, еще для 8.2. Может сейчас имеются другие методы проверки существования объекта в другой базе с тем же GUID по Com-соединению? |
|||
23
hhhh
20.09.20
✎
09:56
|
(22) ОбщегоНазначения.СсылкаСуществует()
|
|||
24
Mikhail Volkov
21.09.20
✎
08:14
|
(23) Т.е. через Com (18)? СсылкаComСуществует = ComСоеденение.ОбщегоНазначения.СсылкаСуществует(СсылкаCom);
|
|||
25
lodger
21.09.20
✎
09:02
|
(24) а как иначе? никто кроме удалённой базы тебе не скажет живая это ссылка, или просто гуид левый. по косвенным признакам живая и битая ссылки равны полностью.
|
|||
26
Mikhail Volkov
22.09.20
✎
07:29
|
(19) ВерсияДанных - это синоним DataVersion, можно по русском писать? Где почитать о ВерсияДанных?
|
|||
27
lodger
22.09.20
✎
09:38
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |