Имя: Пароль:
1C
1С v8
Проверить заполненность ссылки 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
(26) можно.
почитать тут v8: ВерсияДанных
или тут https://its.1c.ru/db/pubessence/content/149/hdoc
Ошибка? Это не ошибка, это системная функция.