|
Как перевести ГУИД в число и обратно? Продолжение | ☑ | ||
---|---|---|---|---|
0
Mr_Best
13.02.17
✎
02:42
|
Доброго времени коллеги !
Необходимо преобразовать ГУИД в число и обратно, нашел эту ветку v8: Как перевести ГУИД в число и обратно? В самом конце есть две функцию, делающие желанные мной вычисления. Но они не работают из "коробки", так как авто забыл приложить дополнительные нестандартные функции. А именно: - бфМат.ПереводЧислаВСистемуСчисления(Ч, 16); - бфМат.ПереводИзСистемыСчисленияВЧисло(СтрGUID, 16); - бфСтроки.ДобавитьНачСимвол(СтрокаЧ16, 32, "0"); Первые две я заменил функциями вот отсюда: Книга знаний: Математические вычисления в 1С Осталась последняя: бфСтроки.ДобавитьНачСимвол(СтрокаЧ16, 32, "0"); Что эта функция должна делать не могу догадаться ! Может кто знает ? Может Гений 1С скинет недостающие ? |
|||
1
h-sp
13.02.17
✎
02:50
|
добавляет левые нули похоже
|
|||
2
Mr_Best
13.02.17
✎
02:51
|
я попробовал добавить с лева ноль, и два нуля, все тщетно
|
|||
3
Torquader
13.02.17
✎
03:09
|
Что такое ГУИД - это 16 байт.
Как перевести 16 байт в число - очень просто - вывести как десятичное число путём деления на 10 с остатком, рассматривая как очень длинное целое. В 1С с этим не должно быть проблем, так как для 1С очень длинные целые могут быть и более 16 байт. |
|||
4
h-sp
13.02.17
✎
03:20
|
(2) вы добавляйте ноль в короткие строки, если строка уже 32 символа, добавлять ноль не нужно.
|
|||
5
Рэйв
13.02.17
✎
08:28
|
как вариант:-)
//------ УИД=СтрЗаменить(ВРЕГ(Строка(ссылка.УникальныйИдентификатор())),"-",""); м16=Новый Массив; мЧ=Новый Массив; м16.Добавить("0"); м16.Добавить("1"); м16.Добавить("2"); м16.Добавить("3"); м16.Добавить("4"); м16.Добавить("5"); м16.Добавить("6"); м16.Добавить("7"); м16.Добавить("8"); м16.Добавить("9"); м16.Добавить("A"); м16.Добавить("B"); м16.Добавить("C"); м16.Добавить("D"); м16.Добавить("E"); м16.Добавить("F"); мЧ.Добавить("00"); мЧ.Добавить("01"); мЧ.Добавить("020"); мЧ.Добавить("03"); мЧ.Добавить("04"); мЧ.Добавить("05"); мЧ.Добавить("06"); мЧ.Добавить("07"); мЧ.Добавить("08"); мЧ.Добавить("09"); мЧ.Добавить("10"); мЧ.Добавить("11"); мЧ.Добавить("12"); мЧ.Добавить("13"); мЧ.Добавить("14"); мЧ.Добавить("15"); Результат=""; Для н=1 по СтрДлина(УИД) Цикл Сим=Сред(УИД,н,1); инд=0; НетСовпадений=Истина; Для Каждого Зн16 из м16 Цикл Если Зн16=Сим Тогда Результат=Результат+мЧ[инд]; НетСовпадений=Ложь; Прервать; КонецЕсли; инд=инд+1; КонецЦикла; Если НетСовпадений Тогда Сообщить("Неопределен символ '"+Сим+"' для преобразование в число."); Возврат; КонецЕсли; КонецЦикла; Сообщить("УИД:'"+УИД +"' |Результат:'"+Результат+"'"); |
|||
6
totparen
13.02.17
✎
08:47
|
С какой целью преобразования?
|
|||
7
totparen
13.02.17
✎
08:52
|
Писал нечто похоже, переводил внутренний идентификатора из 1C 7.7 в GUID и обратно.
|
|||
8
Mr_Best
13.02.17
✎
09:51
|
(6) цель простая. У справочника есть реквизит МетаКод, принимающий значение например от 0 до 99. При записи справочника его необхожимо рассчитать по формуле х mod 99, где первые две цифры после нуля будет искомое значение. Таким образом числа 50, 150, 250 и т.д. до хуллиардов будут иметь МетаКод 50, другими словами каждый 50-тый. Используется для многопоточного обменна данными, где 99 количество потоков, а 50 номер потока который отправит эту регистрацию данных.
|
|||
9
Кирпич
13.02.17
✎
09:53
|
есть такая фигня
&НаКлиенте Функция ГуидВЧисло(Гуид) Гуид = СтрЗаменить(ВРег(Строка(Гуид)),"-",""); Цифры="0123456789ABCDEF"; Длина = СтрДлина(Цифры); ДлинаСтроки = СтрДлина(Гуид); Результат = 0; Для А = 1 По ДлинаСтроки Цикл Символ = Сред(Гуид, А,1); Поз = Найти(Цифры,Символ)-1; Результат = Результат * Длина + Поз; КонецЦикла; Возврат(Результат); КонецФункции &НаКлиенте Процедура Команда1(Команда) КлючУникальности = Новый УникальныйИдентификатор; Сообщить(КлючУникальности); Сообщить(ГуидВЧисло(КлючУникальности)); КонецПроцедуры |
|||
10
Волшебник
модератор
13.02.17
✎
09:53
|
(8) Чушь какая-то
|
|||
11
Cyberhawk
13.02.17
✎
09:57
|
(8) Для многопоточности хранить маркировку объектов в базе не нужно, что-то ты перемудрил. Ну или поясни, зачем хранить маркеры в базе
|
|||
12
Mr_Best
13.02.17
✎
09:59
|
(8) кому чушь, кому скорость в на порядок выше пры выгрузки, но мы же 1сники, о какой это скрости я тут задумался ?
|
|||
13
Mr_Best
13.02.17
✎
10:08
|
(11) транспорт обмена http для общего понимания. При записи справочника создается запись в справонике регистраций, у которого есть числовой код, имя метаданных, ссылка на отправляемый элемент и признак что объект был физически удален. По коду определяется порядок отправки, но при делении на например два потока цепочку изменений одного объекта нужно целиком отнести в один поток, тут мне и поможет метаКод.
|
|||
14
Cyberhawk
13.02.17
✎
10:13
|
(13) Зачем нужно выгружать цепочку изменений объекта, а не его текущее состояние?
|
|||
15
Mr_Best
13.02.17
✎
10:18
|
(14) вообще то вы правы, я планировал держать всегда один, но на принимающей стороне тоже этот объект может быть изменен, при разраве связи и отказа онлайн обмена, возможно прийдется решать коллизию, тут это и пригодится.
|
|||
16
Mr_Best
13.02.17
✎
10:20
|
(14) итоговая система онлайн обмена будет просто содержать настройку, с историей или без
|
|||
17
EugeniaK
13.02.17
✎
10:23
|
А при чем тут вообще ГУИД?
Присваивай рандомное число от 1 до 50ти. Выборка ровнее будет. |
|||
18
Cyberhawk
13.02.17
✎
10:24
|
(16) Даже если нужно выгружать историю состояний объекта, то не ясно, почему не хватает ссылки на объект БД в твоем отдельном справочнике и зачем маркировать сам объект БД...
|
|||
19
Mr_Best
13.02.17
✎
10:39
|
(17) вариант ))) раз выгрузка равномернее будет, тогда так и надо сделать.
(16) объект баз данных не маркируется, маркируется его регистрация, по одной лишь ссылке невозможно определить диапазон потоков, нужно преобразовать сначала в число. А если в про то, что по ссылке в момент отправки можно все рассчитать, то тут все просто, упадет производительность. Я добился увеличения скорости обмена по тестам в 10 раз ! И эта цифра ограничена в том числе количеством потоков и может быть быстрее, все зависит от свободных ресурсов. Код должен быть написан так, что бы "вся нагрузка" была полезной, вот и заморачиваюсь с математикой. |
|||
20
МихаилМ
13.02.17
✎
15:31
|
максимальный гуид не помещает в тип число 1с.
|
|||
21
Кирпич
13.02.17
✎
15:47
|
(20) а какое число у 1С максимальное?
|
|||
22
Mr_Best
13.02.17
✎
15:47
|
(20) я тоже на это подумал, потому что если у гуида убрать "-" и получившееся 16-ти разрядное число конвернуть в 10 и обратно в 16, результат разнится. Остается тогда вопрос, как у Гения 1С это работает по ссылке v8: Как перевести ГУИД в число и обратно?
|
|||
23
Mr_Best
13.02.17
✎
15:48
|
(21) в реквизитах максиму 32 разряда, в номере 50, где-то видел больше, не помню где ...
|
|||
24
Кирпич
13.02.17
✎
16:03
|
(20) проверил. всё влазит.
|
|||
25
Кирпич
13.02.17
✎
16:04
|
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
340 282 366 920 938 463 463 374 607 431 768 211 455 |
|||
26
Кирпич
13.02.17
✎
16:06
|
проверял здесь
http://web2.0calc.com/#collapse_largenumber |
|||
27
Кирпич
13.02.17
✎
16:13
|
Нафига это надо (0) даже вникать не хочу. Чую, глупость какая то.
|
|||
28
Mr_Best
13.02.17
✎
16:13
|
(26) так получилось 39 разрядов, быстрый поиск по гуглу сказал, что максимум 38 разрядов
|
|||
29
Кирпич
13.02.17
✎
16:15
|
(28) в (25) написала 1С. я ж не сам придумал
|
|||
30
Mr_Best
13.02.17
✎
16:16
|
(17) вообще не будем мчать 1с, сделаю как (17), просто и эффективно, а самое главное быстро
|
|||
31
Кирпич
13.02.17
✎
16:18
|
(28) нафига искать в гугле, если можно самому проверить
|
|||
32
Mr_Best
13.02.17
✎
16:22
|
(31)
Это код (функции из ссылки выше): Ш1 = СтрЗаменить(Строка(РезультатЗапроса[0].UUID), "-", ""); Сообщить(Ш1); Д = Из_Любой_В_10(Ш1); Сообщить(Д); Ш2 = Из_10_В_Любую(Д); Сообщить(Ш2); Это результат: 232d9a88a53011e694cdd43d7e023fd3 46 686 852 211 343 832 774 667 430 018 811 047 667 231F8F87F53010F693EEF42F6F022EF3 |
|||
33
Mr_Best
13.02.17
✎
16:23
|
(31) вот такая у меня получилась проверка, не идет. Иль я где-то ошибся ?
|
|||
34
Кирпич
13.02.17
✎
16:25
|
(33) может ошибся. может в 1с косяк какой. я знаю, что моя функция из (9) работает правильно.
|
|||
35
Кирпич
13.02.17
✎
16:29
|
(33) напиши Из_10_В_Любую(Д,16);
балда :) |
|||
36
Mr_Best
13.02.17
✎
16:29
|
(34) а обратно конвертируется правильно ?
|
|||
37
Кирпич
13.02.17
✎
16:30
|
ты в 36 ричную переводишь
|
|||
38
Mr_Best
13.02.17
✎
16:30
|
&AtServer
Функция Из_10_В_Любую(Знач Значение=0,Нотация=16) Экспорт Если Нотация<=0 Тогда Возврат("") КонецЕсли; Значение=Число(Значение); Если Значение<=0 Тогда Возврат("0") КонецЕсли; Значение=Цел(Значение); Результат=""; Пока Значение>0 Цикл Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат; Значение=Цел(Значение/Нотация) ; КонецЦикла; Возврат Результат; КонецФункции //_________________________________________________________ &AtServer Функция Из_Любой_В_10(Знач Значение="0",Нотация=16) Экспорт Если Нотация<=0 Тогда Возврат(0) КонецЕсли; Значение=СокрЛП(Значение); Если Значение="0" Тогда Возврат(0) КонецЕсли; Результат=0; Длина=СтрДлина(Значение); Для Х=1 По Длина Цикл М=1; Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла; Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М; КонецЦикла; Возврат Окр(Результат); КонецФункции Так сойдет ? |
|||
39
Mr_Best
13.02.17
✎
16:30
|
Я ж не совсем балда и не с перепоя :)
|
|||
40
Mr_Best
13.02.17
✎
16:32
|
Если это баг платформы, то в моей копилке это будет четвертый который я смогу легко воспроизвести :)
|
|||
41
Кирпич
13.02.17
✎
16:33
|
(40) где баг то? всё работает
|
|||
42
Mr_Best
13.02.17
✎
16:36
|
(41) что, прямо этот же самый код у вас конвертирует обратно в 16 правильно ?
|
|||
43
Mr_Best
13.02.17
✎
16:36
|
(41) и если так, какая версия платформы ?
|
|||
44
Кирпич
13.02.17
✎
16:37
|
(42) да. 8.3.9.1648
|
|||
45
Sirtoo
13.02.17
✎
16:41
|
(32)
|
|||
46
Sirtoo
13.02.17
✎
16:41
|
как вариант.
|
|||
47
Кирпич
13.02.17
✎
16:46
|
(43) Врег() ты забыл
сразу платформу винить |
|||
48
Mr_Best
13.02.17
✎
16:46
|
Платформа 8.3.9.2033, Клиент-Сервер
Создал новую обработку и на другой базе проверил, в обработке одна команда и код формы: &НаСервере Процедура НачатьНаСервере() Ш1 = Строка(Новый УникальныйИдентификатор); Сообщить(Ш1); Д = Из_Любой_В_10(Ш1); Сообщить(Д); Ш2 = Из_10_В_Любую(Д); Сообщить(Ш2); КонецПроцедуры &НаКлиенте Процедура Начать(Команда) НачатьНаСервере(); КонецПроцедуры &AtServer Функция Из_10_В_Любую(Знач Значение=0,Нотация=16) Экспорт Если Нотация<=0 Тогда Возврат("") КонецЕсли; Значение=Число(Значение); Если Значение<=0 Тогда Возврат("0") КонецЕсли; Значение=Цел(Значение); Результат=""; Пока Значение>0 Цикл Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат; Значение=Цел(Значение/Нотация) ; КонецЦикла; Возврат Результат; КонецФункции &AtServer Функция Из_Любой_В_10(Знач Значение="0",Нотация=16) Экспорт Если Нотация<=0 Тогда Возврат(0) КонецЕсли; Значение=СокрЛП(Значение); Если Значение="0" Тогда Возврат(0) КонецЕсли; Результат=0; Длина=СтрДлина(Значение); Для Х=1 По Длина Цикл М=1; Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла; Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М; КонецЦикла; Возврат Окр(Результат); КонецФункции Результат: 4e090376-0710-43d2-9609-c398fa23caa9 5 491 141 155 062 634 646 918 224 854 143 808 955 412 217 3F090375F070FF42F1F9608EF397EF22EEF9 |
|||
49
Mr_Best
13.02.17
✎
16:46
|
Вот так !
|
|||
50
Кирпич
13.02.17
✎
16:47
|
ВРег()
балда |
|||
51
Кирпич
13.02.17
✎
16:48
|
Гуид = СтрЗаменить(ВРег(Строка(Гуид)),"-","");
|
|||
52
Mr_Best
13.02.17
✎
16:56
|
(50) да !
Тема закрыта |
|||
53
МихаилМ
13.02.17
✎
17:02
|
извиняюсь
гуид помещяетя в число 1с (21) пер1 = pow(2,128); максимальное число пер1 = pow(10,990000000); //пер1 = pow(2,128); //пер1 = 340282366920938463463374607431768211456; степ2 = LOG10(пер1)/LOG10(2); сообщить(" "+пер1); сообщить("__________ "+степ2); НО лог10 с этим число не работает. |
|||
54
Кирпич
13.02.17
✎
17:05
|
(53) в 1с не все функции с большими числами работают. я даже ВК делал одному умному чуваку, который чота вычислял большое на 1с и у него не работала функция Exp()
|
|||
55
Mr_Best
13.02.17
✎
22:59
|
Полный проверенный код, честно слизанный с статей из топика и собранный в кучу:
Функция УникальныйИдентификаторВЧисло(GUID) Экспорт СтрокаGUID = СтрЗаменить(Строка(GUID), "-", ""); //Первая восьмерка ч1 = Сред(СтрокаGUID, 1, 2); ч2 = Сред(СтрокаGUID, 3, 2); ч3 = Сред(СтрокаGUID, 5, 2); ч4 = Сред(СтрокаGUID, 7, 2); //Первая четверка ч5 = Сред(СтрокаGUID, 9, 2); ч6 = Сред(СтрокаGUID, 11, 2); //Вторая четверка ч7 = Сред(СтрокаGUID, 13, 2); ч8 = Сред(СтрокаGUID, 15, 2); //Хвост ч9 = Сред(СтрокаGUID, 17, 16); СтрGUID = ч4 + ч3 + ч2 + ч1 + ч6 + ч5 + ч8 + ч7 + ч9; Ч = Из_Любой_В_10(СтрGUID); Возврат Ч; КонецФункции Функция УникальныйИдентификаторИзЧисла(Ч) Экспорт СтрокаGUID = Из_10_В_Любую(Ч); //Первая восьмерка ч1 = Сред(СтрокаGUID, 1, 2); ч2 = Сред(СтрокаGUID, 3, 2); ч3 = Сред(СтрокаGUID, 5, 2); ч4 = Сред(СтрокаGUID, 7, 2); //Первая четверка ч5 = Сред(СтрокаGUID, 9, 2); ч6 = Сред(СтрокаGUID, 11, 2); //Вторая четверка ч7 = Сред(СтрокаGUID, 13, 2); ч8 = Сред(СтрокаGUID, 15, 2); //Хвост ч9 = Сред(СтрокаGUID, 17, 4); ч10 = Сред(СтрокаGUID, 21, 12); СтрGUID = ч4 + ч3 + ч2 + ч1 + "-" + ч6 + ч5 + "-" + ч8 + ч7 + "-" + ч9 + "-" + ч10; Возврат Новый УникальныйИдентификатор(СтрGUID); КонецФункции Функция Из_10_В_Любую(Значение, Нотация = 16) Экспорт Если Нотация <= 0 Тогда Возврат ""; КонецЕсли; Значение = Число(Значение); Если Значение <= 0 Тогда Возврат "0"; КонецЕсли; Значение = Цел(Значение); Результат = ""; Пока Значение > 0 Цикл Результат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Значение%Нотация + 1, 1) + Результат; Значение = Цел(Значение/Нотация); КонецЦикла; Возврат Результат; КонецФункции Функция Из_Любой_В_10(Значение, Нотация = 16) Экспорт Если Нотация <= 0 Тогда Возврат 0; КонецЕсли; Значение = СокрЛП(Значение); Если Значение = "0" Тогда Возврат 0; КонецЕсли; Результат = 0; Длина = СтрДлина(Значение); Для Х = 1 По Длина Цикл М = 1; Для У = 1 По Длина - Х Цикл М = М * Нотация; КонецЦикла; Результат = Результат + (Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Сред(Значение, Х, 1)) - 1) * М; КонецЦикла; Возврат Окр(Результат); КонецФункции |
|||
56
Кирпич
13.02.17
✎
23:03
|
(55) первые две функции школьник какой то писал
|
|||
57
Кирпич
13.02.17
✎
23:04
|
нафига они вообще нужны?
|
|||
58
Chikko
22.02.17
✎
01:20
|
На тему случайно наткнулся, мб кому в будущем поможет:
в ут11 функции "ЧисловойКодПоСсылке" и "ПолучитьСсылкуПоШтрихкодуТабличногоДокумента" делают то что нужно. (типовой текст, думаю, копипастить не нужно) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |