![]() |
V8-V7 по COM Доброго дня, коллеги! При работе с 7.7 из БП 3.0 по COM возникла засада, которую не знаю как решить. В 7.7 ищется Объект типа "Справочник", назовем его Объект77. А затем мне надо спозиционироваться на него объектом определенного типа, вот так например: Контр77 = БазаOLE.CreateObject("Справочник.Контрагенты"); Контр77.НайтиЭлемент(Элемент77); Так вот, поиск в упор не работает. Пару лет назад не стал разбираться, а заменил поиск НайтиЭлемент на поиск по коду: Контр77.НайтиПоКоду(Элемент77.Код); Это все отлично работает, хотя я очень не люблю поиск по коду. Но вот возникло продолжение, появились нужда в справочниках, которые не имеют ни кода, ни наименования, например Единицы. И как же их искать? Можно конечно приделать к справочнику код, но как-то не хотелось бы. Стал разбираться почему не ищет и обнаружил, что БазаOLE.ЗначениеВСтрокуВнутр возвращает строку с неизвестным видом справочника, то есть "172" (Контрагенты) напрочь пропадает. Та же проблема и при использовании класса MetaDataWork из 1С++. Метод ValueToLongDBString теряет вид объекта. Пробовал сам конструировать правильное внутреннее представление и подсовывать его в БазаOLE.ЗначениеИзСтрокиВнутр, но безуспешно, выдается ошибка Кто сталкивался, как обойти эту проблему ? |
по ком работают только примитивные типы.. NULL, Неопределено, Число, Строка, Дата, Булево и массивы. Данные типа "Объект" нормально работают если только они созданы через COM, т.е. в вашем случае "Элемент77" должен быть создан в базе, присоединенной через COM, а не в базе инициализирующей COM соединение. [url]https://its.1c.ru/db/metod8dev#content:2262:hdoc@59413ad2[/url] [url]https://its.1c.ru/db/metod8dev#content:2263:hdoc[/url] |
Я знаю про примитивные типы, но объект и найден в базе 77, и на него я хочу спозиционироваться |
Надо видимо в 77 завести глобальную переменную и ей присваивать найденный объект и потом уже найти элемент, где аргумент эта глобальная переменная |
[quote=USSR;46924015] ...но объект и найден в базе 77, и на него я хочу спозиционироваться... [/quote] А база77 тоже так считает? Например Сообщить(Элемент77.Код+" "+Элемент77.Наименование) что-то ведь должно выдать. Или что возвращает Контр77.НайтиЭлемент(Элемент77) 0 / -1 / 1 (вечно путаю, а код не под рукой. Но что-то ведь должен вернуть "НайтиЭлемент") |
Я осознал свою детскую ошибку, тему можно закрывать) (4) на это я и попался, что Элемент77 все нормально возвращает, и код, и наименование, но существует он не в базе 77, а а контексте обработки 8.3. Найтиэлемент возвращает 0. Но искать элемент77 и на него позиционироваться надо не в 8.3, а в базе 77. Но вот получится ли Так сделать большой вопрос. Проще наверное будет из 77 цепляться к 83, а не наоборот. Все будет искаться и писать можно в транзакции. |
(0) Собственно ты ответил на свой вопрос. Элемент77 не является элементом справочника "Контрагенты". Соответственно НайтиЭлемент(Элемент77) для Объекта=Справочник.Контрагенты вернет пустое значение. Посмотри через ЗначениеВСтроку(Элемент77) что возвращается. И уже дальше копай, почему вместо ожидаемого элемента справочника Контрагенты получил элемент другого справочника (а может и не справочника). |
[quote=USSR;46924772] ...Проще наверное будет из 77 цепляться к 83, а не наоборот... [/quote] Потому как явно путаница произошла в разбивке процедур #Наклиенте #Сервере После выполнения Контр77 = БазаOLE.CreateObject("Справочник.Контрагенты"); Сам "Контр77" меняет в отладчике значение с Пусто на OLE ? |
Что-то мое просветление закончилось и опять окутало сомнение. Давайте внесем ясность на простых модельных примерах Пример1 Контр1 = База77.CreateObject("Справочник.Контрагенты"); Контр2 = База77.CreateObject("Справочник.Контрагенты"); Контр1.НайтиПоКоду(1); Элемент77 = Контр1.ТекущийЭлемент(); Рез = Контр.НайтиЭлемент(Элемент77); Сообщить(Рез); Пример2 Рег = База77.CreateObject("Справочник.Регистратор"); Контр = База77.CreateObject("Справочник.Контрагенты"); Рез = Рег.НайтиПоКоду(1); Сообщить(Рез); Элемент77 = Рег.Элемент; Рез = Контр.НайтиЭлемент(Элемент77); Сообщить(Рез); Так вот. В примере1 элемент77 благополучно ищется, в вот в примере 2 его поиск возвращает 0. База77.ЗначениеВСтрокуВнутр не распознает вид справочника. Возвращается, например, вот такое значение: "B","0","0","0","0","0"," 0 5650 " При этом Элемент77.Вид() возвращает "Контрагенты", более того, все реквизиты верны, например Элемент77.ЮрФизЛицо.ИНН )) |
В примере 2, Рег.Элемент - справочник неопределенного вида. Так вот оказывается, что если Рег.Элемент - справочник определенного вида, то все начинает работать как часики. Значит все дело не в контекстах объектов, а в косячности V77.Application. Путается он со справочником неопределенного вида. |
Отрекаюсь от (5) и все-таки полагаю, что в 8.3 мне по COM должны быть доступны все методы встроенного языка 7.7, ведь оперирую объектами, созданными в 8.3. Но вот со справочником неопределенного вида такая засада. А если не получается в 8.3 спозиционироваться на требуемый элемент справочника, то придется это делать в базе 7.7, вызывая нужные процедуры из 8.3 через EvalExpr, но тогда придется перетаскивать в 7.7 и всю запись справочников и документов. Тогда нет смысла в связке 8.3-7.7, проще юзать 7.7 -> 8.3. Наверное клиентом всегда должна быть база в которой пишешь, а сервером в которой читаешь |
А может к Реквизиту "Элемент" при Создании Элемента Спр.Регистратор не применяется НазначитьВид(<?>,); ? |
Или может так? (почти, не пользовался этим) === Рег = База77.CreateObject("Справочник.Регистратор"); Контр = База77.CreateObject("Справочник.Контрагенты"); Рез = Рег.НайтиПоКоду(1); Сообщить(Рез); База77.НазначитьВид(Рег.Элемент, "Контрагенты"); Элемент77 = Рег.Элемент; Рез = Контр.НайтиЭлемент(Элемент77); Сообщить(Рез); |
(11)Не назначал, но по моему это и не нужно. Это применяется вроде как для реквизитов формы. В базе у реквизита правильное значение и правильное внутреннее представление (для справочника неопределенного вида). Не знаю, может ты и прав, что если назначить вид, то внутреннее представление тоже станет как для определенного вида. Надо проверить |
(13)Это не прокатит, Рег.Элемент определен в контексте 8.3 |
(8) Ну правильно. У тебя Рез - найденный по коду элемент справочника "Регистратор", а пытаешься получить значение реквизита "Элемент" у объявленной переменной объекта "Справочник.Регистратор". |
Не поверите, заработало: Рез = Контр.НайтиЭлемент(Элемент77.ТекущийЭлемент()); Сам бы никогда не догадался. Бесподобный smaharbA: Стр=ОлеИсточник.ЗначениеВСтрокуВнутр(СпрОЛЕ.ТекущийЭлемент())//ТекущийЭлемент() обязательно, даже если СпрОЛЕ уже элемент |
Текущее время: 10:01. Часовой пояс GMT +3. |