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