Имя: Пароль:
1C
1C 7.7
v7: Как найти элемент по внутреннему идентификатору 7.7
0 Gena1984
 
22.04.12
20:49
Всем привет. Подскажите пожалуйста, может кто сталкивался. Как в 1с 7.7 найти элемент (справочника например) зная внутренний идентификатор.
1 dangerouscoder
 
22.04.12
20:56
Посмотри ЗначениеВСтроку() ЗначениеИзСтроки()
2 andrewks
 
22.04.12
20:59
3 Torquader
 
22.04.12
21:14
Нужно понимать, что для нахождения элемента нужно знать ИдТипа,ИдВида и ИдЭлемента - только тогда найденный элемент найдётся однозначно.
4 Gena1984
 
22.04.12
21:16
Опс, забыл сказать что объект пытаюсь получить из ОЛЕ.
Код примерно такой.

Функция ПолучитьКодИз77(ИД)        
База77 = Новый COMОбъект("V77.Application");
Открыта = База77.Initialize(База77.RMTrade, "", "NO_SPLASH_SHOW");    
ОбъектПоиска = База77.CreateObject("Справочник.Контрагенты");
//И вот здесь нужно как то найти элемент в 7.7. Типа:
ОбъектПоиска.НайтиПоРеквизиту("id77",ИД);
//Но так понятно, что не сработает. Ни как не могу додуматься
Возврат ОбъектПоиска.ТекущийЭлемент().Код;
КонецФункции
5 Gena1984
 
22.04.12
21:17
ИД получаю из файла 1Cv77Chs.dat
6 Torquader
 
22.04.12
21:17
(4) В курсе, что в каждой базе внутренний идентификатор свой ?
7 Gena1984
 
22.04.12
21:19
Да.
8 Torquader
 
22.04.12
21:22
(5) Там идентификатор будет в виде строки в системе счисления с основанием 36 - нужно переводить в десятичную и добавлять код распределённой базы.
9 Злопчинский
 
22.04.12
22:05
Объект = ЗначениеИзСтрокиВнутр(строкавнутреннегоида);
Док.НайтиДокумент(Объект)
.
типа так
10 Cthulhu
 
22.04.12
22:49
//==============================================================================
// НАЗНАЧЕНИЕ:    Получение ID объекта данных (Перечисление,Счет,Справочник,Документ)
//    ВВЕДЕНИЕ:    Перечень ID объекта данных:    Тип(1)+Вид(10)+Объект(10)+КодИБ(3)
//                Полный ID объекта складываетсчя из этих ID в указанном порядке, длина=24
//                В случае определенности типа справочника значение имеет только [Объект(10)+КодИБ(3)]
//    ПАРАМЕТЫ:    * тОбъект    -    объект данных (ВНИМАНИЕ! для выборки - обязательно
//                                "<ВыборкаОбъектов>.Текущий{Счет/Элемент/Документ}()"!)
//                * тИдСЗ        -    тип возвращаемого значения (СЗ=0/1/2/3/4, ПолныйИД,ТипИД,ВидИД,ОбъектИД,ИдИБ)
//    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ:    * Явный возврат: Заданный во втором параметре ID
//                            * Дополнительно: Во втором параметре вызова возвращается СЗ со всеми ID (см.выше)
//------------------------------------------------------------------------------
Функция ПолучитьИДыОбъекта(Знач тОбъект,тИдСЗ=0) Экспорт
   Перем _Ок,тТипВозврата,тСЗ,тТхт;
   тТхт=ТипЗначенияСтр(тИдСЗ);
   Если тТхт="СписокЗначений" Тогда
       тИдСЗ.УдалитьВсе(); тТипВозврата="*";
   Иначе
       Если тТхт="Число" Тогда тТипВозврата=тИдСЗ Иначе тТипВозврата=Число(СокрЛП(тИдСЗ)) КонецЕсли;
       тИдСЗ=СоздатьОбъект("СписокЗначений"); тТипВозврата=Макс(0,Мин(4,Окр(тТипВозврата,0)));
       тТипВозврата=?(тТипВозврата=4,"ИдИБ",?(тТипВозврата=3,"ИдОбъекта",?(тТипВозврата=2,"ИдВида",?(тТипВозврата=1,"ИдТипа","*"))));
   КонецЕсли;
   тСЗ=СоздатьОбъект("СписокЗначений"); тТхт=ТипЗначенияСтр(тОбъект);
   Если тТхт="СписокЗначений" Тогда    // в Объекте получен СЗ (выдернуть из него ИД-ы)
       тОбъект.Выгрузить(тСЗ);
   ИначеЕсли тТхт="Строка" Тогда        // в Объекте получено внутреннее представление (=ЗначениеВСТрокуВнутр(<данные>))
       тСЗ.ИзСтрокиСРазделителями(Сред(Лев(тОбъект,СтрДлина(тОбъект)-1),2));
   ИначеЕсли Найти("СчетПеречислениеСправочникДокумент",ТипЗначенияСтр(тОбъект))>0 Тогда    // В объекте получен сам обыект данных:
       тОбъект=ЗначениеВСтрокуВнутр(тОбъект); тСЗ=СоздатьОбъект("СписокЗначений");
       тСЗ.ИзСтрокиСРазделителями(Сред(Лев(тОбъект,СтрДлина(тОбъект)-1),2));
   Иначе Возврат("") КонецЕсли;
   тТхт=СокрЛП(тСЗ.ПолучитьЗначение(1));    // T=счет/O=документ/B=справочник/E=перечисление/U=неопределеннный:
   Если ПустоеЗначение(тТхт)=1 Тогда тТхт="U" Иначе тТхт=?(Найти("TOBEU",Лев(тТхт,1))=0,"U",Лев(тТхт,1)) КонецЕсли;
   _Ок=тТхт;
   тТхт=тСЗ.ПолучитьЗначение(тСЗ.РазмерСписка());
   Если СтрДлина(тТхт)=13 Тогда тТхт=Формат(Число(тСЗ.ПолучитьЗначение(4)),"Ч10") Иначе тТхт=Лев(тТхт,10) КонецЕсли;
   _Ок=_Ок+тТхт;
   тТхт=тСЗ.ПолучитьЗначение(тСЗ.РазмерСписка());
   Если СтрДлина(тТхт)>13 Тогда тТхт=Прав(тТхт,13) КонецЕсли;
   _Ок=_Ок+Формат(Число(Лев(тТхт,СтрДлина(тТхт)-3)),"Ч10")+Прав(тТхт,3);
   тИдСЗ.Установить("ИдТипа",Лев(_Ок,1));
   тИдСЗ.Установить("ИдВида",Сред(_Ок,2,10));
   тИдСЗ.Установить("ИдОбъекта",Сред(_Ок,12,10));
   тИдСЗ.Установить("ИдИБ",Прав(_Ок,3));
   Если тТипВозврата<>"*" Тогда _Ок=тИдСЗ.Получить(тТипВозврата) КонецЕсли;
   Возврат(_Ок);
КонецФункции //ПолучитьИДыОбъекта
//------------------------------------------------------------------------------
// Способы вызова:
//    - только первый параметр = внутреннее представление
//    - только первый параметр = Ключ(24) = ИдТипа(1)+ИдВида(10)+ИдОбъекта(10)+ИдИБ(3)
//    - в параметрах заданы все четре ИД-а
Функция ПолучитьОбъектПоИДам(Знач ИдТипа,Знач ИдВида="",Знач ИдОбъекта="",Знач ИдИБ="", Знач тБазаОЛЕ="") Экспорт
   Перем _Ок;
   Если ТипЗначенияСтр(ИдТипа)="СписокЗначений" Тогда
       ИдВида=ИдТипа.Получить("ИдВида");
       ИдОбъекта=ИдТипа.Получить("ИдОбъекта");
       ИдИБ=ИдТипа.Получить("ИдИБ");
       ИдТипа=ИдТипа.Получить("ИдТипа");
       Если ТипЗначенияСтр(тБазаОЛЕ)="OLE" Тогда
           _Ок=тБазаОЛЕ.ValueFromStringInternal("{"""+ИдТипа+""",""0"",""0"","""
           +ИдВида+""",""0"",""0"","""+Формат(Число(ИдОбъекта),"Ч10")+Формат(ИдИБ,"С3")+"""}");
       Иначе//Если ТипЗначенияСтр(тБазаОЛЕ)<>"OLE" Тогда
           _Ок=ЗначениеИзСтрокиВнутр("{"""+ИдТипа+""",""0"",""0"","""
           +ИдВида+""",""0"",""0"","""+Формат(Число(ИдОбъекта),"Ч10")+Формат(ИдИБ,"С3")+"""}");
       КонецЕсли;
   ИначеЕсли СтрДлина(ИдТипа)=24 Тогда
       Если Лев(ИдТипа,1)="T" Тогда    // Счет - составляется по-другому
           _Ок="{""T"",""0"",""0"",""0"",""0"",""0"","""+Сред(ИдТипа,2)+"""}";
       Иначе//Если Лев(ИдТипа,1)<>"T" Тогда
           _Ок="{"""+Лев(ИдТипа,1)+""",""0"",""0"","""+Сред(ИдТипа,2,10)+""",""0"",""0"","""+Сред(ИдТипа,12)+"""}";
       КонецЕсли;
       Если ТипЗначенияСтр(тБазаОЛЕ)="OLE" Тогда
           //_Ок=тБазаОЛЕ.ValueFromStringInternal(_Ок);
           _Ок=тБазаОЛЕ.EvalExpr("ЗначениеИзСтрокиВнутр("""+СтрЗаменить(_Ок,"""","""""")+""")");
       Иначе//Если ТипЗначенияСтр(тБазаОЛЕ)<>"OLE" Тогда
           _Ок=ЗначениеИзСтрокиВнутр(_Ок);
       КонецЕсли;
   ИначеЕсли Лев(ИдТипа,1)="{" Тогда
       Если ТипЗначенияСтр(тБазаОЛЕ)="OLE" Тогда
           //_Ок=тБазаОЛЕ.ValueFromStringInternal(ИдТипа);
           _Ок=тБазаОЛЕ.EvalExpr("ЗначениеИзСтрокиВнутр("""+СтрЗаменить(ИдТипа,"""","""""")+""")");
       Иначе//Если ТипЗначенияСтр(тБазаОЛЕ)<>"OLE" Тогда
           _Ок=ЗначениеИзСтрокиВнутр(ИдТипа);
       КонецЕсли;
   КонецЕсли;
   Возврат(_Ок);
КонецФункции //ПолучитьОбъектПоИДам
//------------------------------------------------------------------------------