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

v7: Как получить ГУИД номенклатуры по ее ссылке?

v7: Как получить ГУИД номенклатуры по ее ссылке?
Я
   altaykniga
 
20.04.21 - 22:43
Доброго времени суток, уважаемые специалисты!

1с77. Каким образом можно получить УникальныйИдентифиатор элемента справочника Номенклатура по его ссылке?

Нашел в интернете след.метод:

[1с]
Инфо = СоздатьОбъект("AddIn.V7SysInfo");
ГлобальноУникальныйИдентификатор = Инфо.СоздатьGUID();
[/1с]

Смущает код "Инфо.СоздатьGUID();"   Т.е. гуид не читается, а генерируется? Т.е. сгенерированный ГУИД к элементу справочника никак не привязан?

Вкратце задача следующая: будет организован обмен (самописная обработка) по выгрузке номенклатуры из базы 1с77 в УНФ. Хотел использовать ГУИД элемента справочника как ключ связи. Т.е. создам в УНФ доп.реквизит "ГУИД_1с77", при первоначальной выгрузке заполню его значением из 1с77, и в дальнейшем по этому полю смогу выполнять поиск номенклатуры и в УНФ, и в 1с77
   mikecool
 
1 - 20.04.21 - 22:54
емнип ,в 7ке нет гуидов
ЗначениеВСтрокуВнутр содержить в себе подобие гуид
   altaykniga
 
2 - 20.04.21 - 22:57
(1) большое спасибо. Подозревал, что нет гуидов, но решил спросить здесь...

значит придется сначала в 1с77 создать новый реквизит номенклатуры "Гуид", сформировать для каждого элемента гуид методом "Инфо.СоздатьGUID();". И сделать генерацию Гуид для новых элементов номенклатуры. Затем уже выгружать Номенклатуру в УНФ (тоже предварительно создав в УНФ такой же реквизит "Гуид")
   Garykom
 
3 - 20.04.21 - 22:59
(2) Не надо так
Делаете ЗначениеВСтрокуВнутр а затем из него формируете Гуид по правилам, так чтобы можно было обратный сделать.
   altaykniga
 
4 - 20.04.21 - 23:01
(3) т.е. в 1с77 создавать реквизит "Гуид" не нужно? Достаточно получить для объекта ЗначениеВСтрокуВнутр, и уже от этого плясать?
   altaykniga
 
5 - 20.04.21 - 23:06
(3) а как из "ЗначениеВСтрокуВнутр()" сформировать гуид по правилам в 1с77 ?
   Злопчинский
 
6 - 20.04.21 - 23:11
1. использовать формекс
GUID = глСервис.ПолучитьGUID(1);// 1 - без скобок, 0 или опущен - со скобками
   Злопчинский
 
7 - 20.04.21 - 23:13
"Затем уже выгружать Номенклатуру в УНФ"
во время выгрузки в УНФ - проверять - если GUID - пустой - генерить его, записывать 77-элемент.
таким образом ГУИДЫ будут автогенериться при выгрузке. также можно сделать автогенерацию гуидов ПРИЗАПИСИ() элемента справочника (аналогичным образом) или ПриЗакрытии() формы элемента справочника
   Злопчинский
 
8 - 20.04.21 - 23:14
В УНФ штатными методами создать дополнительный реквизит (я в облаке, поэтому штатно, без пофигуратора) - писать в него GUID при загрузке. штатная загрузка из внешних источников позволяет это сделать..
   Злопчинский
 
9 - 20.04.21 - 23:15
(4) ну... я бы делал более прозрачно, в 77 реквизит GUID для элементов справочников И ДЛЯ ГРУПП Если надо
   Злопчинский
 
10 - 20.04.21 - 23:18
Вышеописанное - сделано у меня в 77 и в УНФ, работает ОК.
   Garykom
 
11 - 20.04.21 - 23:22
   altaykniga
 
12 - 20.04.21 - 23:22
(7,8,9) - так и хотел сделать, спасибо. Значит в (3) нет необходимости: "Делаете ЗначениеВСтрокуВнутр а затем из него формируете Гуид по правилам, так чтобы можно было обратный сделать."
   Garykom
 
13 - 20.04.21 - 23:22
Кто то с NS общался кстати?
   Builder
 
14 - 20.04.21 - 23:23
Чем не устраивает просто Код номенклатуры?
   altaykniga
 
15 - 20.04.21 - 23:23
(7) "во время выгрузки в УНФ - проверять - если GUID - пустой - генерить его, записывать 77-элемент."

каким кодом моно генерить гуид в 1с77 ?
   Garykom
 
16 - 20.04.21 - 23:24
(14) Угу можно использовать код и добавить при необходимости какой справочник
   altaykniga
 
17 - 20.04.21 - 23:24
(14) в 1с77 код номенклатуры уникален только в группе
   altaykniga
 
18 - 20.04.21 - 23:24
(17) ну в моей базе данных
   Builder
 
19 - 20.04.21 - 23:25
(17) Бывает :)
   mikecool
 
20 - 20.04.21 - 23:31
(17) ПОлныйКод() или как там его
   Builder
 
21 - 20.04.21 - 23:33
(20) Поменяется если переместить в другую группу.
Проще перенумеровать код и включить полную уникальность.
   Злопчинский
 
22 - 20.04.21 - 23:52
(12) нет, я тупо и просто добавил реквизит GUID в номенклатуру, контрагентов и еще куда-то уже не помню
   Злопчинский
 
23 - 20.04.21 - 23:53
(15) использовать формекс (кроме гуида там еще куча плюшек)
глСервис = СоздатьОбъект("Сервис");// можно вынести в глобмодуль экспортной переменной

далее - читаем (6)
   Злопчинский
 
24 - 20.04.21 - 23:55
аналогичный механизм синхронизации по ГУИДАМ юзаю и в обменах межжду клюшечными базами (чтобы потом не переделывать при миграции на 8-ку.
   Cthulhu
 
25 - 21.04.21 - 03:19
// штатно

//------------------------------------------------------------------------------
// НАЗНАЧЕНИЕ:    Получение 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" Тогда

            _Ок=ЗначениеИзСтрокиВнутр(ИдТипа);
        КонецЕсли;
    КонецЕсли;
    Возврат(_Ок);
КонецФункции//ПолучитьОбъектПоИДам
   victuan1
 
26 - 21.04.21 - 07:52
(4) Да, только к нему еще приклейте какой-нибудь префикс, уникальный для текущей базы 1с. Т.к. если будете грузить данные из разных баз 1С, они могут случайно совпасть по Внтур.ИД.
А вот ПрефиксИБ+Внтур.ИД дадут полноценный псевдоГУИД.
   Кирпич
 
27 - 21.04.21 - 08:27
_IdToStr() - получает 10-ное число, возвращает его 36-ное представление. _StrToId() – наоборот, получает 36-ное, возвращает 10-ное.
   Mikeware
 
28 - 21.04.21 - 08:32
(27) О-это буква, 0-это цифра!©


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