|
v7: Как получить ГУИД номенклатуры по ее ссылке? | ☑ | ||
---|---|---|---|---|
0
altaykniga
20.04.21
✎
22:43
|
Доброго времени суток, уважаемые специалисты!
1с77. Каким образом можно получить УникальныйИдентифиатор элемента справочника Номенклатура по его ссылке? Нашел в интернете след.метод:
Смущает код "Инфо.СоздатьGUID();" Т.е. гуид не читается, а генерируется? Т.е. сгенерированный ГУИД к элементу справочника никак не привязан? Вкратце задача следующая: будет организован обмен (самописная обработка) по выгрузке номенклатуры из базы 1с77 в УНФ. Хотел использовать ГУИД элемента справочника как ключ связи. Т.е. создам в УНФ доп.реквизит "ГУИД_1с77", при первоначальной выгрузке заполню его значением из 1с77, и в дальнейшем по этому полю смогу выполнять поиск номенклатуры и в УНФ, и в 1с77 |
|||
1
mikecool
20.04.21
✎
22:54
|
емнип ,в 7ке нет гуидов
ЗначениеВСтрокуВнутр содержить в себе подобие гуид |
|||
2
altaykniga
20.04.21
✎
22:57
|
(1) большое спасибо. Подозревал, что нет гуидов, но решил спросить здесь...
значит придется сначала в 1с77 создать новый реквизит номенклатуры "Гуид", сформировать для каждого элемента гуид методом "Инфо.СоздатьGUID();". И сделать генерацию Гуид для новых элементов номенклатуры. Затем уже выгружать Номенклатуру в УНФ (тоже предварительно создав в УНФ такой же реквизит "Гуид") |
|||
3
Garykom
гуру
20.04.21
✎
22:59
|
(2) Не надо так
Делаете ЗначениеВСтрокуВнутр а затем из него формируете Гуид по правилам, так чтобы можно было обратный сделать. |
|||
4
altaykniga
20.04.21
✎
23:01
|
(3) т.е. в 1с77 создавать реквизит "Гуид" не нужно? Достаточно получить для объекта ЗначениеВСтрокуВнутр, и уже от этого плясать?
|
|||
5
altaykniga
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 и в УНФ, работает ОК.
|
|||
11
Garykom
гуру
20.04.21
✎
23:22
|
||||
12
altaykniga
20.04.21
✎
23:22
|
(7,8,9) - так и хотел сделать, спасибо. Значит в (3) нет необходимости: "Делаете ЗначениеВСтрокуВнутр а затем из него формируете Гуид по правилам, так чтобы можно было обратный сделать."
|
|||
13
Garykom
гуру
20.04.21
✎
23:22
|
Кто то с NS общался кстати?
|
|||
14
Builder
20.04.21
✎
23:23
|
Чем не устраивает просто Код номенклатуры?
|
|||
15
altaykniga
20.04.21
✎
23:23
|
(7) "во время выгрузки в УНФ - проверять - если GUID - пустой - генерить его, записывать 77-элемент."
каким кодом моно генерить гуид в 1с77 ? |
|||
16
Garykom
гуру
20.04.21
✎
23:24
|
(14) Угу можно использовать код и добавить при необходимости какой справочник
|
|||
17
altaykniga
20.04.21
✎
23:24
|
(14) в 1с77 код номенклатуры уникален только в группе
|
|||
18
altaykniga
20.04.21
✎
23:24
|
(17) ну в моей базе данных
|
|||
19
Builder
20.04.21
✎
23:25
|
(17) Бывает :)
|
|||
20
mikecool
20.04.21
✎
23:31
|
(17) ПОлныйКод() или как там его
|
|||
21
Builder
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-ку.
|
|||
25
Cthulhu
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" Тогда _Ок=ЗначениеИзСтрокиВнутр(ИдТипа); КонецЕсли; КонецЕсли; Возврат(_Ок); КонецФункции //ПолучитьОбъектПоИДам |
|||
26
victuan1
21.04.21
✎
07:52
|
(4) Да, только к нему еще приклейте какой-нибудь префикс, уникальный для текущей базы 1с. Т.к. если будете грузить данные из разных баз 1С, они могут случайно совпасть по Внтур.ИД.
А вот ПрефиксИБ+Внтур.ИД дадут полноценный псевдоГУИД. |
|||
27
Кирпич
21.04.21
✎
08:27
|
_IdToStr() - получает 10-ное число, возвращает его 36-ное представление. _StrToId() – наоборот, получает 36-ное, возвращает 10-ное.
|
|||
28
Mikeware
21.04.21
✎
08:32
|
(27) О-это буква, 0-это цифра!©
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |