Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: как получить уид в 7?

v7: как получить уид в 7?
Я
   Мисти
 
26.07.19 - 15:18
Не могу найти такого волшебного слова!
Подскажите?
 
 
   ДенисЧ
 
1 - 26.07.19 - 15:22
А его там нет...
Максимум значениеВСТрокуВнутр()
   Мисти
 
2 - 26.07.19 - 15:31
Как это?? Нет уида??
   Мисти
 
3 - 26.07.19 - 15:32
Реквизиты.ДобавитьЗначение(ЗначениеВстрокуВнутр(Док.Фирма)    , "ФирмаИд"); - похоже, что это то, что мне надо.
Оно ж вполне уникальное?
И повторяемое?
   ptiz
 
4 - 26.07.19 - 15:32
Один из примеров:
Функция ПолучитьID(Ссылка) 
    Перем Стр;
    Стр=ЗначениеВСтрокуВнутр(Ссылка); 
    СЗ=СоздатьОбъект("СписокЗначений");
    СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2));
    Возврат  _IdToStr(СЗ.ПолучитьЗначение(СЗ.РазмерСписка()));
КонецФункции
   quest
 
5 - 26.07.19 - 15:33
(2) Ну вот так - нет. Живи теперь с этим.
   Мисти
 
6 - 26.07.19 - 15:38
_IdToStr - а это что?
   Мисти
 
7 - 26.07.19 - 15:39
опишите, пожалуйста!
Мне ,наверное, достаточно
ЗначениеВстрокуВнутр(Док.Фирма) и использовать эту строку в качестве уникального кода?
   Kigo_Kigo
 
8 - 26.07.19 - 15:40
Функция СоздатьGUID()
    TypeLib = CreateObject("Scriptlet.TypeLib");
    NewGUID = TypeLib.Guid();
    TypeLib = "";
    Возврат NewGUID;
КонецФункции
   Sserj
 
9 - 26.07.19 - 15:51
Ну а если есть стандартная компонента V7Plus то там есть объект V7Sysinfo и у него метод СоздатьGUID()
   ptiz
 
10 - 26.07.19 - 15:51
   Мисти
 
11 - 26.07.19 - 16:00
А мне не надо создать, мне нужно найти.
Суть в том, что нужно 7 перегрузить в 8, при этом при этом коды "в пределах подчинения", а составной код не проходит по размеру.
Или записать составной код в доп. реквизит?
   Kigo_Kigo
 
12 - 26.07.19 - 16:06
(11) это чтоле?
ПолныйКод()
Синтаксис:
ПолныйКод()
Назначение:
Возвращает строку, содержащую полный код выбранного элемента справочника со всеми вышестоящими уровнями, разделенными символом /.
   Мисти
 
13 - 26.07.19 - 16:09
Полный код в код не встает.
Хотя в качестве доп. реквизита можно и его, наверное!
   trad
 
14 - 26.07.19 - 16:15
ЗначениеВстрокуВнутр - дает уникальный идентификатор в рамках ИБ
   Kigo_Kigo
 
15 - 26.07.19 - 16:20
ПолныйИдентификатор()
Синтаксис:
ПолныйИдентификатор()
Назначение:
Возвращает полный идентификатор объекта (идентификатор объекта с идентификаторами его родителей через точку).

отсекай индетефикаторы родителей и пользуй
Уид = Спр.ПолныйИдентификатор()
Для А=1 по 10 цикл
Если СтрНайти(Уид,".") <> 0 Тогда
Уид = Сред(Уид,СтрНайти(Уид,"."));

Иначе
Возврат Уид;
КонецЕсли;

КонецЦикла
   Мисти
 
16 - 26.07.19 - 21:44
Засада! Для группы есть только "кодДляПоиска", а его длины тоже не хватит.
Доп. реквизитов-то нет!
   Garykom
 
17 - 26.07.19 - 21:54
Составной ключ используй уникальный вместо УИД.
   Сияющий в темноте
 
18 - 26.07.19 - 23:35
тебе коды на кой сдались?
создай таблицу,где пиши идентификаторы из семерки хоть по полному коду и ему в соответствие гуид из восьмерки,и перегружай ссылки на обьекты по этой таблице.
   Мисти
 
19 - 26.07.19 - 23:36
Это я сегодня напишу таблицу, а завтра мы будем заново перегружать...
Т.е. - во внешнюю таблицу?
Ну, это слишком!
   Lazy Stranger
 
20 - 26.07.19 - 23:40
может проще поменять в 7-ке все коды на уникальные и потом переставить нумерацию на "по всему справочнику"
   Мисти
 
21 - 26.07.19 - 23:48
в 7 нельзя ничего менять, она на ладан дышит.
   ДенисЧ
 
22 - 27.07.19 - 08:15
Мне бы ваши проблемы...
   АгентБезопаснойНацио
 
23 - 27.07.19 - 08:57
(22) зачем?
   Cthulhu
 
24 - 27.07.19 - 09:08
//------------------------------------------------------------------------------

// НАЗНАЧЕНИЕ:    Получение 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,"ИдТипа","*"))));
    КонецЕсли;
    тСЗ=СоздатьОбъект("СписокЗначений");
    тТхт=ТипЗначения(тОбъект)//ТипЗначенияСтр(тОбъект);

    Если тТхт=0 Тогда тТхт=ТипЗначенияСтр(тОбъект);
    ИначеЕсли тТхт=1 Тогда тТхт="Число";
    ИначеЕсли тТхт=2 Тогда тТхт="Строка";
    ИначеЕсли тТхт=3 Тогда тТхт="Дата";
    ИначеЕсли тТхт=10 Тогда тТхт="Перечисление";
    ИначеЕсли тТхт=11 Тогда тТхт="Справочник";
    ИначеЕсли тТхт=12 Тогда тТхт="Документ";
    ИначеЕсли тТхт=13 Тогда тТхт="Календарь";
    ИначеЕсли тТхт=14 Тогда тТхт="ВидРасчета";
    ИначеЕсли тТхт=15 Тогда тТхт="Счет";
    ИначеЕсли тТхт=16 Тогда тТхт="ВидСубконто";
    ИначеЕсли тТхт=17 Тогда тТхт="ПланСчетов";
    ИначеЕсли тТхт=100 Тогда тТхт=ТипЗначенияСтр(тОбъект) КонецЕсли;
    Если тТхт="СписокЗначений" Тогда    // в Объекте получен СЗ (выдернуть из него ИД-ы)

        тОбъект.Выгрузить(тСЗ);
    ИначеЕсли тТхт="Строка" Тогда        // в Объекте получено внутреннее представление (=ЗначениеВСТрокуВнутр(<данные>))

        тСЗ.ИзСтрокиСРазделителями(Сред(Лев(тОбъект,СтрДлина(тОбъект)-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" Тогда

            _Ок=ЗначениеИзСтрокиВнутр(ИдТипа);
        КонецЕсли;
    КонецЕсли;
    Возврат(_Ок);
КонецФункции//ПолучитьОбъектПоИДам

//------------------------------------------------------------------------------
   АгентБезопаснойНацио
 
25 - 27.07.19 - 09:10
И я так и не понял, чем не нравятся преобразования вида и ида с дополнением нулями?


Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь во втором сообщении вам дадут решение, а в двадцатом дадут правильное решение. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.