Имя: Пароль:
1C
 
Как перевести ГУИД в число и обратно?
,
0 Гений 1С
 
гуру
13.12.08
11:51
Сабж.
1 rs_trade
 
13.12.08
11:55
(0) наверно так же как и 16-ричное число в десятичное, хотя могу ошибаться....
2 Гений 1С
 
гуру
13.12.08
11:56
(1) Там порядок тетрадок важен
3 rs_trade
 
13.12.08
11:56
(2) ты хочешь именно в десятичное число?
4 Господин ПЖ
 
13.12.08
11:57
(1) а как его обратно собрать?...
5 Балабес
 
13.12.08
11:58
сделать тип строка
6 rs_trade
 
13.12.08
11:58
если просто взять гуид как 16-ричное число и убрать разделители, страшно представить какое там десятичное число получиться...
7 rs_trade
 
13.12.08
11:59
хотя собственно гуид и есть число...только не десятичное...
8 wertyu
 
13.12.08
12:01
(0) уже заводил тему - что опять вотка?
9 Мелкий бес
 
13.12.08
12:06
Функция ПолучитьGUIDПоУникальномуИдентификатору(Знач UUID)
   ч1 = Сред(UUID,20,4);
   ч2 = Сред(UUID,25,12);
   ч3 = Сред(UUID,15,4);
   ч4 = Сред(UUID,10,4);
   ч5 = Сред(UUID,1,8);
   Возврат "0x" + ч1 + ч2 + ч3 + ч4 + ч5;
КонецФункции
10 Гений 1С
 
гуру
13.12.08
12:12
(8) Там было несколько другое
11 wertyu
 
13.12.08
12:13
(10) ну тогда сорри
12 Гений 1С
 
гуру
13.12.08
12:13
(9) Это проверенная информация?
13 wertyu
 
13.12.08
12:14
(12) здесь не церковь, вас не обманут (с) Бендер
14 rs_trade
 
13.12.08
12:15
(12) вполне очевидная функция, что не понятного в ней?
15 Гений 1С
 
гуру
13.12.08
12:17
(14) меня только порядок тетрад беспокоит. Ну ладно, если все ок. то я включаю ее в свою библиотеку функций.
16 Гений 1С
 
гуру
13.12.08
12:18
Вроде так:
Функция УникальныйИдентификаторВЧисло(GUID) Экспорт
   //Назначение: Преобразует GUID в число
   //ДатаСоздания: 20080101
   //Автор: Fixin
   //Тестирована: Да
   //Благодарность: МелкийБес за указание порядка тетрад
   //Ссылка: v8: Как перевести ГУИД в число и обратно?
   //Описание:
   ч1 = Сред(GUID,20,4);
   ч2 = Сред(GUID,25,12);
   ч3 = Сред(GUID,15,4);
   ч4 = Сред(GUID,10,4);
   ч5 = Сред(GUID,1,8);
   СтрGUID = ч1 + ч2 + ч3 + ч4 + ч5;
   //СтрGUID = УникальныйИдентификаторВСтроку(GUID);
   Сумма=0; Множитель=1;
   Для Инд=1 По СтрДлина(СтрGUID) Цикл
       Симв=ВРЕГ(Сред(СтрGUID, Инд, 1));
       Поз=Найти("123456789ABCDEF", Симв);
       Сумма=Сумма+Поз*Множитель;
       Множитель=Множитель*16;
   КонецЦикла;
   
   Возврат Сумма;
КонецФункции
17 wertyu
 
13.12.08
12:19
(16) если не секрет ты чего делаешь?
18 rs_trade
 
13.12.08
12:20
(16)а зачем?
19 Гений 1С
 
гуру
13.12.08
12:31
(17) Синхронизирую контакты с аутлук, в поле User4 контакта проставляю уникальный номер ссылки, соответствующей этому контакту в справочнике Контакты. Преобразовываю ГУИД в длину 25 символов по 36-ричной системе счисления, чтобы занимал 25, а не 32 символа, экономия таки.
20 rs_trade
 
13.12.08
12:33
(19) контактов миллионов 50?
21 Гений 1С
 
гуру
13.12.08
12:34
а обратный процесс как? вот у меня есть число, как его перевести в GUID?
22 wertyu
 
13.12.08
12:35
(20) ладно тебе это же Гений - можно уже было привыкнуть
23 Гений 1С
 
гуру
13.12.08
12:35
(20) нет около 2000, просто при отправке на смартфон экономия 7*2000 = 14 кбайт.
24 rs_trade
 
13.12.08
12:39
(23) для смартфона да, актуально...
25 Гений 1С
 
гуру
13.12.08
14:01
Функция СжатыйУникальныйИдентификатор(ГУИД = Неопределено) Экспорт
   //Назначение: Возвращает 25-разрядную строку из ГУИД по базе: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   //ДатаСоздания: 20081213
   //Автор: Fixin
   //Тестирована: Да
   //$ГУИД: Неопределено или УникальныйИдентификатор
   //Тест:
   //    ГУИД = Новый УникальныйИдентификатор("22345200-abe8-4f60-90c8-0d43c5f6c0f6");
   //    Сообщить(ГУИД);
   //    Ч = бфТипы.УникальныйИдентификаторВЧисло(ГУИД);
   //    Сообщить(Ч);
   //    РезГуид = бфТипы.УникальныйИдентификаторИзЧисла(Ч);
   //    Сообщить(РЕЗГУИД);


   //    ГУИДСжатый = бфТипы.СжатыйУникальныйИдентификатор(ГУИД);
   //    Сообщить(ГУИДСжатый);
   //    РезГУИД2 = бфТипы.УникальныйИдентификаторИзСжатого(ГУИДСжатый);
   //    Сообщить(РЕЗГУИД2);

   
   Если ГУИД = Неопределено Тогда
       ТекГУИД = Новый УникальныйИдентификатор();
   Иначе
       ТекГУИД = ГУИД;
   КонецЕсли;
   Ч = УникальныйИдентификаторВЧисло(ТекГУИД);
   Р = бфМат.ПереводЧислаВСистемуСчисления(Ч, 36, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
   Р = бфСтроки.ДобавитьНачСимвол(Р, 25, "0"); //Нормализируем до длины 25
   Возврат Р;
КонецФункции

Функция УникальныйИдентификаторИзСжатого(СжатыйГУИД) Экспорт
   //Назначение: Возвращает обычный уникальный идентификатор из сжатого 25-разрядного
   //ДатаСоздания: 20081213
   //Автор: Fixin
   //Тестирована: Нет
   //$ГУИД: Неопределено или УникальныйИдентификатор
   
   Ч = бфМат.ПереводИзСистемыСчисленияВЧисло(СжатыйГУИД, 36, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
   Р = бфТипы.УникальныйИдентификаторИзЧисла(Ч);
   Возврат Р;
КонецФункции


Функция УникальныйИдентификаторВЧисло(GUID) Экспорт
   //Назначение: Преобразует GUID в число
   //ДатаСоздания: 20080101
   //Автор: Fixin
   //Тестирована: Да
   //Благодарность: МелкийБес за указание порядка тетрад
   //Ссылка: v8: Как перевести ГУИД в число и обратно?
   //Описание:
   СтрокаGUID = Строка(GUID);
   ч1 = Сред(СтрокаGUID,20,4);
   ч2 = Сред(СтрокаGUID,25,12);
   ч3 = Сред(СтрокаGUID,15,4);
   ч4 = Сред(СтрокаGUID,10,4);
   ч5 = Сред(СтрокаGUID,1,8);
   СтрGUID = ч1 + ч2 + ч3 + ч4 + ч5;
   Ч = бфМат.ПереводИзСистемыСчисленияВЧисло(СтрGUID, 16);
   
   Возврат Ч;
КонецФункции

Функция УникальныйИдентификаторИзЧисла(Ч) Экспорт
   //Назначение: Преобразует число в уникальный идентификатор
   //ДатаСоздания: 20081213
   //Автор: Fixin
   //Тестирована: Да
   //Описание:
   
   СтрокаGUID = бфСтроки.ДобавитьНачСимвол(бфМат.ПереводЧислаВСистемуСчисления(Ч, 16), 32, "0");
   
   ч4 = Сред(СтрокаGUID,1,4);
   ч5 = Сред(СтрокаGUID,5,12);
   ч3 = Сред(СтрокаGUID,17,4);
   ч2 = Сред(СтрокаGUID,21,4);
   ч1 = Сред(СтрокаGUID,25,8);
   
   СтрGUID = ч1 + "-" + ч2 + "-" + ч3 + "-" +ч4 + "-" + ч5;
   Возврат Новый УникальныйИдентификатор(СтрGUID);
КонецФункции
26 Гений 1С
 
гуру
13.12.08
14:02
И тест соответственно:

ГУИД = Новый УникальныйИдентификатор("22345200-abe8-4f60-90c8-0d43c5f6c0f6");
Сообщить(ГУИД);
Ч = бфТипы.УникальныйИдентификаторВЧисло(ГУИД);
Сообщить(Ч);
РезГуид = бфТипы.УникальныйИдентификаторИзЧисла(Ч);
Сообщить(РЕЗГУИД);


ГУИДСжатый = бфТипы.СжатыйУникальныйИдентификатор(ГУИД);
Сообщить(ГУИДСжатый);
РезГУИД2 = бфТипы.УникальныйИдентификаторИзСжатого(ГУИДСжатый);
Сообщить(РЕЗГУИД2);
27 Гений 1С
 
гуру
13.12.08
14:02
Тест выдает:
22345200-abe8-4f60-90c8-0d43c5f6c0f6
192 447 559 805 613 441 075 694 136 988 370 489 856
22345200-abe8-4f60-90c8-0d43c5f6c0f6
8KKJTDWBYFOY845G9L8ICSS8W
22345200-abe8-4f60-90c8-0d43c5f6c0f6


Короче, я только не уверен, что мне Злобный Мальчик дал правильный алгол для преобразования ГУИД в число, но если он правильный, то все пучком.
28 Гений 1С
 
гуру
15.12.08
09:43
http://partners.v8.1c.ru/forum/thread.jsp?id=640527

Коллеги, на партнерском не могут мне помочь. Может вы подскажете:
Написал алгоритм для перевода ГУИД в 16-ричный формат.
Подскажите, коллеги, правильно или нет.

Переводил ГУИД: "22345200-abe8-4f60-90c8-0d43c5f6c0f6"
Получил шестнадцатичеричное число: 90C80D43C5F6C0F64F60ABE822345200
29 luns
 
15.12.08
09:49
Странное пристрастие к ГУИДам... что не ветка то про гуид...
Наверное это потому что они длинные... ))))))))))
30 NcSteel
 
15.12.08
09:54
Краснов Денис очень подробно ответил.
31 Гений 1С
 
гуру
15.12.08
09:59
(30) Не фига он не ответил. У меня был конкретный вопрос - правильно ли я перевел число ГУИД в шестнадцатеричный формат. А он что ответил?
32 Гений 1С
 
гуру
15.12.08
09:59
(29) Вылизывают библиотеку функций просто
33 NcSteel
 
15.12.08
10:06
"Если представлять ГУИД как это делает 1С в строках <Объект не найден....>, то скомпоновал ты правильно." Краснов Денис.
34 Гений 1С
 
гуру
15.12.08
10:24
(33) а если нет? меня интересует не как 1с переводит, а как правильно.
Дайте мне ссылку на страницу в интернете, где написано: "Например, ГУИД такой-то в шестнадцатеричной форме пишется так".
35 Odin1C
 
15.12.08
10:26
(25)  СтрокаGUID = бфСтроки.ДобавитьНачСимвол(бфМат.ПереводЧислаВСистемуСчисления(Ч, 16), 32, "0");

Эта функция слева прибавляет 32 символа "0"?
36 Deon
 
15.12.08
10:31
фиксин, ты женат?
37 Гений 1С
 
гуру
15.12.08
11:43
(36) сходи в мой дневник и узнаешь, гыгыгы
(35) нет, она дополняет до длины 32.
38 Гений 1С
 
гуру
15.12.08
11:43
Блин, так неужели правильный ответ знает только БГ.
Коллеги, кто снимет имидж "тупого 1сника"???
39 NcSteel
 
15.12.08
11:52
Нет "правильного" перевода в число. Какой алгоритм задашь такой и будет.
40 Гений 1С
 
гуру
15.12.08
12:12
(39)
Коллега, ну что вы такое говорите? ГУИД: "22345200-abe8-4f60-90c8-0d43c5f6c0f6" это вполне конкретное 128-битное число. Оно не может быть произвольным, т.к. по ГУИД формируется например CLSID OLE-объектов.

Вот я и спрашиваю, это: ox90C80D43C5F6C0F64F60ABE822345200 или нет
41 bahmet
 
15.12.08
12:27
(40) Спецом для тебя запустил скуль и написал:

declare @a uniqueidentifier
set @a = '40bf67bb-742c-4355-abb9-dff6a60bd701'
print cast(@a as varbinary)

И вот какой ответ:

0xBB67BF402C745543ABB9DFF6A60BD701
42 Гений 1С
 
гуру
15.12.08
13:10
блин, ты все запутал. кому теперь верить?
43 Гений 1С
 
гуру
15.12.08
13:26
блин, эта тема освещена где-нибудь в интернете, или такой банальнейший вопрос остался за гранью освещения
44 Гений 1С
 
гуру
15.12.08
13:27
есть какой-то стандарт преобразования ГУид в число?
45 Мой ник
 
15.12.08
13:28
(43) ты рождён, чтобы задокументировать эту фишку и сделать внятное описание в интернете. А то наделали гуи, зачем не понятно, никто не знает как работает.
46 bahmet
 
15.12.08
15:09
(42)(43)(44)Хочешь сказать в Microsoft SQL 2005 наврали с преобразованием?
47 Гений 1С
 
гуру
15.12.08
19:15
(46) Я хочу найти ссылку в документации, блин
Счас буду копать про ToByteArray()
48 Гений 1С
 
гуру
15.12.08
19:18
нет, я просто тащусь. Никто не знает такой банальнейшей вещи, ладно я дебил... но другие-то
49 Господин ПЖ
 
15.12.08
19:24
50 kot_bcc
 
15.12.08
20:46
(49) Читаю себе, читаю. Сирожа, все дела. Тут бац, и ссылка на майкрософт. Ну, думаю, вот и гейтсу теперь Осипов снится будет. Потом уже перевел взгляд, увидел автора поста. Вы так не пугайте:)

ЗЫ на (23): Вообще, такие вещи сперва стоит проверять. Аутлук хранит строки в UTF-16. Паршивая там экономия будет.
51 Гений 1С
 
гуру
16.12.08
07:39
(50) Не скажи, на 20 000 контактах то, уже не 7 байт, а 14!
52 Гений 1С
 
гуру
16.12.08
07:39
к тому же с чего ты взял, что значения полей она хранит в UTF 16, возможно это текст хранится в этой кодировке
53 Гений 1С
 
гуру
16.12.08
07:40
Да и вообще, вопрос вроде бы простой, а ответ никто не знает, гыгыгы.
54 Гений 1С
 
гуру
16.12.08
08:11
Т.к. вопрос оказался сложнее, чем народ думал, задал еще и на SQL:
http://sql.ru/forum/actualthread.aspx?tid=623614&pg=-1
55 kot_bcc
 
17.12.08
16:11
(51) Какие 14 байт? 16 байт GUID как GUID, и 50 байт на GUID как строку. Еще раз - какие 14 байт какой экономии?
56 kot_bcc
 
17.12.08
16:12
(52) Достаточно открыть pst, чтобы в этом убедиться.
57 kot_bcc
 
17.12.08
16:14
+(55) "50 байт...на строку" + "если 25 символов в 36-ричной системе"
58 kot_bcc
 
17.12.08
16:18
+(56) И чем же отличается поле с 25-значным 36-ричным числом от поля текстового?
59 rs_trade
 
17.12.08
16:23
по сабжу, GUID это и есть число...
60 Гений 1С
 
гуру
18.12.08
09:08
(55) Как ты собираешься в аутлуке хранить GUID как GUID
(59) По сабжу меня интересовал порядок тетрад, чтобы преобразовать GUID в 16ричную форму, не надо умничать на пустом месте, буквоедство detected
61 Дуб
 
18.12.08
09:10
(60) ещё один проснулся. Жениться тебе надо.
62 kot_bcc
 
18.12.08
09:25
(60) А догадаться слабо? Как 8 пар байт. Причем, в том же самом поле типа "Строка". И прежде чем кричать про нули - советую таки попробовать.
63 H A D G E H O G s
 
18.12.08
09:34
Че раскричались?
64 kot_bcc
 
18.12.08
09:36
(63):))))) Пытаемся представить, как будет выглядеть чудак, пытающийся позвонить по смартфону с 20000 контактов:)
65 H A D G E H O G s
 
18.12.08
09:39
Счаст напишу алгоритм
66 H A D G E H O G s
 
18.12.08
09:50
Погодь, чего то я не въехал, Гений. Тебе же просто надо число из 16-ричной системы в 10-тичную перевести. И все!
67 H A D G E H O G s
 
18.12.08
09:51
Ты откуда проблему на 60 постов высосал?
68 Гений 1С
 
гуру
18.12.08
09:53
(62) если я догадаюсь - я могу и ошибитьяс, а мне надо точно знать. Я этот код в библиотеку функций включаю
69 Гений 1С
 
гуру
18.12.08
09:54
(64) нолик лишний, у меня 2000 контактов
70 kot_bcc
 
18.12.08
10:01
(69) Внимательно курим пост (51)
71 Гений 1С
 
гуру
18.12.08
10:03
(70) Описка
72 kot_bcc
 
18.12.08
10:08
(68) Ладно. Говорю точнее. С точки зрения microsoft - гуид это 16 байт, которые можно представить также в виде 4 длинных слов (слева направо, индекс с 0) (т.н. "старое" представление), или в виде строки в нескольких вариантах, или в наборе из (длинное слово, короткое слово, короткое слово, 12 байт).
73 kot_bcc
 
18.12.08
10:08
Продолжать?
74 kot_bcc
 
18.12.08
10:15
Еще на (69) Человек, ковыряющий 2000 контактов, смотрится примерно также, как человек с 20000 контактов. Качесвтенный переход, вообще говоря, несколько ниже, как я понимаю.
75 kot_bcc
 
18.12.08
10:19
+(72) Я таки продолжу. Вопрос про разнообразие видов строк представления GUID почти тривиален. В контексте 1С это либо вид "{ХХХХХХХХ-ХХХХ-ХХХХ-ХХХХХХХХХХХХ}", либо какой-либо пользовательский (например - в 36-ричной системе).
76 kot_bcc
 
18.12.08
10:22
+(75) Но менять систему исчисления имеет смысл только ради экономии (losless-сжатия). Причем, необходимо учитывать, что существуют более эффективные способы такого сжатия. Об одном из которых я и говорю. Он очень прост. Достаточно перейти от представления в виде строки к представлению в виде набора чисел.
77 kot_bcc
 
18.12.08
10:26
+(76) 1. В (72) очепятка. "12 байт" -> "6 байт"
2. Совершенно необязательно следовать представлениям microsoft о группах в наборе GUID. Достаточно обеспечить взаимное преобразование. Что и было сделано (со строкой), например, в (16).
78 kot_bcc
 
18.12.08
10:29
+(77) Ну, и, собсно, пример losless без строки. Представим GUID как 8 коротких слов (по 16 бит). Такое представление тривиально хранится в строковых переменных с кодировкой UTF-16 (т.е. везде, практически): одно слово - один символ, всего 8 символов.
79 kot_bcc
 
18.12.08
10:32
Осталось только пробразовать группы символов (по 4 16-ричных символа на каждое слово) из "классического" строкового представления GUID в числа и обратно.
80 kot_bcc
 
18.12.08
10:35
(66) Ему это число (128 бит в пределе) надо еще как-то засунуть в Outlook, в контакты. Да еще он хочет, чтобы покороче:)
81 kot_bcc
 
18.12.08
10:43
+(79) Здесь я вижу только один подводный камень. Все сказанное не проверялось на wince-девайсах. Если winmobile 5/6 - проблем с нулевыми символами быть не должно.
82 Гений 1С
 
гуру
18.12.08
10:54
(77) Меня интересует вопрос академически, а не "лишь бы сделать", лишь бы сделать не вопрос. Меня интересует, в каком именно порядке должны идти в результирующее число тетрады из ГУИД. Но вы не парьтесь, на партнерке мне уже дали правильный ответ.
По крайней мере в SQL и в функции JAVA guidtobyteArray результат одинаковый, значит можно считать его правильным.
83 bahmet
 
18.12.08
11:05
(82) Гений 1С ! выруби своего дятла и вруби гения, а потом кури пост (41)+ кури свою найденую ссылку на сайте мелкомягких...
84 Serg_1960
 
18.12.08
11:29
Кину ссылку на Вики - может поможет разобраться с типами GUID'ов и зачем "переставляют" группы http://ru.wikipedia.org/wiki/GUID
85 Гений 1С
 
гуру
18.12.08
12:03
(83) Просто приведи пример.
(84) Хахаха. В этой статье строку:
"Например, '22345200-abe8-4f60-90c8-0d43c5f6c0f6' соответствует шестнадцатеричному 128-битному числу 0x00523422E8AB604F90C80D43C5F6C0F6" написал я, по материалам разборки полетов с ГУИД на партнерке. Надеюсь, правильно.
86 Гений 1С
 
гуру
21.12.08
11:40
Написал функцию конвертации, провел тесты:

ГУИД: 40bf67bb-742c-4355-abb9-dff6a60bd701
ГУИД числом: 249 104 320 812 803 032 337 390 685 874 299 852 545
ГУИД в шестнадцатеричной с/с: BB67BF402C745543ABB9DFF6A60BD701
ГУИД из шестнадцатеричной с/с обратно: 249 104 320 812 803 032 337 390 685 874 299 852 545
ГУИД восстановленный: 40bf67bb-742c-4355-abb9-dff6a60bd701
ГУИД равны: истина
ГУИД: 22345200-abe8-4f60-90c8-0d43c5f6c0f6
ГУИД числом: 426 825 793 464 474 646 002 922 100 115 292 406
ГУИД в шестнадцатеричной с/с: 523422E8AB604F90C80D43C5F6C0F6
ГУИД из шестнадцатеричной с/с обратно: 426 825 793 464 474 646 002 922 100 115 292 406
ГУИД восстановленный: 22345200-abe8-4f60-90c8-0d43c5f6c0f6
ГУИД равны: истина

Что забавно, функции конвертации числа в ГУИД и обратно оказались симметричными, т.е. практически идентичный код, наверное это как раз и говорит о том, что конвертация правильная:

<pre>

Функция УникальныйИдентификаторВЧисло(GUID) Экспорт
   //Назначение: Преобразует GUID в число
   //ДатаСоздания: 20080101
   //Автор: Fixin
   //Тестирована: Да
   //Благодарность: Алмазов Петр
   //Ссылка: v8: Как перевести ГУИД в число и обратно?
   //Ссылка: http://partners.v8.1c.ru/forum/thread.jsp?id=640731
   //Пример:
   //    declare @a uniqueidentifier
   //    set @a = '40bf67bb-742c-4355-abb9-dff6a60bd701'
   //    print cast(@a as varbinary)
   //    0xBB67 BF40 2C74 5543 ABB9 DFF6 A60B D701
   //Пример:
   //    40bf67bb-742c-4355-abb9-dff6a60bd701'.ToByteArray()=
   //    0xBB67 BF40 2C74 5543 ABB9 DFF6 A60B D701
   //    '22345200-abe8-4f60-90c8-0d43c5f6c0f6'.ToByteArray()=
   //    0x0052 3422 E8AB 604F 90C8 0D43 C5F6 C0F6
   //Описание:
   //    Конвертирует GUID в число с правильным расположением тетрад.
   //    Можно быть уверенным что функции cast языка SQL и ToByteArray языка JAVA конвертируют так же.
   
   Строка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;
   Ч = бфМат.ПереводИзСистемыСчисленияВЧисло(СтрGUID, 16);
   
   Возврат Ч;
КонецФункции

Функция УникальныйИдентификаторИзЧисла(Ч) Экспорт
   //Назначение: Преобразует число в уникальный идентификатор
   //ДатаСоздания: 20081213
   //Автор: Fixin
   //Тестирована: Да
   //Благодарность: Алмазов Петр
   //Ссылка: v8: Как перевести ГУИД в число и обратно?
   //Ссылка: http://partners.v8.1c.ru/forum/thread.jsp?id=640731
   //Пример:
   //    declare @a uniqueidentifier
   //    set @a = '40bf67bb-742c-4355-abb9-dff6a60bd701'
   //    print cast(@a as varbinary)
   //    0xBB67 BF40 2C74 5543 ABB9 DFF6 A60B D701
   //Пример:
   //    40bf67bb-742c-4355-abb9-dff6a60bd701'.ToByteArray()=
   //    0xBB67 BF40 2C74 5543 ABB9 DFF6 A60B D701
   //    '22345200-abe8-4f60-90c8-0d43c5f6c0f6'.ToByteArray()=
   //    0x0052 3422 E8AB 604F 90C8 0D43 C5F6 C0F6
   //Описание:
   //    Конвертирует GUID в число с правильным расположением тетрад.
   //    Можно быть уверенным что функции cast языка SQL и ToByteArray языка JAVA конвертируют так же.
   
   СтрокаGUID = бфСтроки.ДобавитьНачСимвол(бфМат.ПереводЧислаВСистемуСчисления(Ч, 16), 32, "0");
   
   //Первая восьмерка
   ч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);
КонецФункции


</pre>
87 Балабес
 
21.12.08
12:35
ГУИД для лохов, даже 1С использует binary(16)
Ошибка? Это не ошибка, это системная функция.