Имя: Пароль:
1C
1C 7.7
v7: Как получить внутренний идентификатор через OLE
0 LisaAlisa
 
05.12.17
16:37
Из одной базы 7.7 выполняется подключение к другой по OLE. Получаем объекты. Как получить ID объекта?
1 Бертыш
 
05.12.17
16:40
Типа v7.EvalExpr("ЗначениеВстрокуВнутр(ТвойОбъект)");
2 LisaAlisa
 
05.12.17
16:40
ID объекто текущй базы получаю
_IdToStr(СтрПолучитьСтроку(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ЗначениеВСтрокуВнутр(Обж),"{",""),"}",""),Симв(34),""),",",РазделительСтрок),7))+"   ";

Но это не работает, если Обж - объект OLE
3 Бертыш
 
05.12.17
16:42
Через v7.EvalExpr(
4 LisaAlisa
 
05.12.17
16:51
Возврат _IdToStr(СтрПолучитьСтроку(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ПУБ.EvalExpr("ЗначениеВстрокуВнутр(Обж)"),"{",""),"}",""),Симв(34),""),",",РазделительСтрок),7))+"   ";;
{Обработка.ИмпортДокументов.Форма.Модуль(18)}: 1С:Предприятие: 1    ЗначениеВстрокуВнутр(Обж<<?>>)
Переменная не определена (Обж)
5 Ёпрст
 
гуру
05.12.17
16:57
Обж - это че у тя ?
6 Ёпрст
 
гуру
05.12.17
16:58
ну и надо ОлеБаза.ЗначениеВСтрокуВнутр..
а так, через метадатаворк всё проще делать, или через вызов глобальной функции, которая сразу вернёт id в норм виде.
7 Бертыш
 
05.12.17
17:06
(6) Пытается использовать недокументированные функции 77
8 LisaAlisa
 
06.12.17
10:16
(5) Обж - это объект, полученный из базы источника
примерно так:
    ДокПУБ=ПУБ.CreateObject("Документ");
    ДокПУБ.ВыбратьДокументы(Дата1,Дата2);
...        
Обж = ДокПУБ.Субконто1
...

Функция ПолучитьID(Обж)
    СпрИст = ПУБ.CreateObject("Справочник."+Обж.Вид()+"");
    СпрИст.НайтиЭлемент(Обж);
    Возврат _IdToStr(СтрПолучитьСтроку(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ПУБ.EvalExpr("ЗначениеВстрокуВнутр(СпрИст)"),"{",""),"}",""),Симв(34),""),",",РазделительСтрок),7))+"   ";;
КонецФункции

выдает ошибку Возврат _IdToStr(СтрПолучитьСтроку(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ПУБ.EvalExpr("ЗначениеВстрокуВнутр(СпрИст)"),"{",""),"}",""),Симв(34),""),",",РазделительСтрок),7))+"   ";;
{Обработка.ИмпортДокументов.Форма.Модуль(20)}: 1С:Предприятие: 1    ЗначениеВстрокуВнутр(СпрИст<<?>>)
Переменная не определена (СпрИст)
9 ProxyInspector
 
06.12.17
10:27
Самый простой способ добавить в ОЛЕ базу процедуры

//-----------------------------------------------
Функция адЗначениеИзСтрокиВнутр(ВнутреннийИдентификатор) Экспорт
    Возврат ЗначениеИзСтрокиВнутр(ВнутреннийИдентификатор);
КонецФункции
//-----------------------------------------------
Функция адЗначениеВСтрокуВнутр(Объект) Экспорт
    Возврат ЗначениеВСтрокуВнутр(Объект);
КонецФункции
10 Ёпрст
 
гуру
06.12.17
10:30
(8) СпрИст.ТекущийЭлемент(), это для начала
11 ProxyInspector
 
06.12.17
10:30
Ну и вызов соответственно
ВнутреннийИдентификатор = БазаОЛЕ.адЗначениеВСтрокуВнутр(ОбъектОЛЕ)

Обратно
ОбъектОЛЕ = БазаОЛе.адЗначениеИзСтрокиВнутр(ВнутреннийИдентификатор)
12 Ёпрст
 
гуру
06.12.17
10:30
СпрИст = ПУБ.CreateObject("Справочник."+Обж.Вид()+"");
    СпрИст.НайтиЭлемент(Обж);

вот это всё выкинуть из функции, это там не нужно, от слова совсем
13 ProxyInspector
 
06.12.17
10:36
Совсем для эстетов
ВнутреннийИдентификатор = БазаОЛЕ.ValueToString(ОбъектОЛЕ)
ОбъектОЛЕ = БазаОЛе.ValueFromStringInternal(ВнутреннийИдентификатор)
   так я не пробовал, но должно работать
14 LisaAlisa
 
06.12.17
10:47
(9) я не могу менять базу источника, она типовая
15 LisaAlisa
 
06.12.17
10:48
(10) делала, пишет неопознанный оператор СпрИст.ТекущийЭлемент() <<?>>
16 LisaAlisa
 
06.12.17
10:54
(12) убрала. Оставила так:
Функция ПолучитьID(Обж)
    Возврат _IdToStr(СтрПолучитьСтроку(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ПУБ.EvalExpr("ЗначениеВстрокуВнутр(Обж.ТекущийЭлемент())"),"{",""),"}",""),Симв(34),""),",",РазделительСтрок),7))+"   ";
КонецФункции

{Обработка.ИмпортДокументов.Форма.Модуль(20)}: 1С:Предприятие: 1    ЗначениеВстрокуВнутр(Обж.ТекущийЭлемент()<<?>>)
Неопознанный оператор
17 Табуретко
 
06.12.17
10:58
(14) без этих строк, Вам идентификатор не получить.
18 Табуретко
 
06.12.17
11:00
не хотите портить типовую? сделайте во внешней обработке и запускайте по примеру Как выполнить процедуру внешней обработки через OLE
19 Ёпрст
 
гуру
06.12.17
11:04
(16)

ПУБ.ЗначениеВстрокуВнутр(Обж), что возвращает ?
Дальше думай :)
20 Табуретко
 
06.12.17
11:05
или что мешает выписать все возможные идентификаторы из удаленной и прописать в обработке? если конечно не ваяете универсальную нетленку )
21 LisaAlisa
 
06.12.17
11:49
Заработало так
_IdToStr(СтрПолучитьСтроку(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ПУБ.ЗначениеВстрокуВнутр(Обж.ТекущийЭлемент()),"{",""),"}",""),Симв(34),""),",",РазделительСтрок),7))+"   ";

Спасибо всем за помощь!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн