Получение ГУИД 1С из значения SQL binary поля IDRRef

1. aviconsult 48 26.12.17 16:46 Сейчас в теме
SQL функция, позволяющая получить из идентификатора, хранимого на уровне таблицы, получить ГУИД 1С, который можно преобразовать в объект конфигурации
Спорадически приходится возвращаться к задаче получения ГУИД-а для 1С средствами прямого SQL, например, в связи интеграцией с системами не на платформе 1С. Исторически правила формирования ГУИД несколько раз менялись, поэтому мы решили вынести его получение в отдельную функцию на сервере так, чтоб она могла работать централизовано и универсально. Ниже представлен код:

CRE ATE   FUNCTION [dbo].[Get_1C_GUID_From_IDRRef] (@IDRRef binary(16))
--получает ГУИД 1С (вида 9299c542-7d64-11e1-8dde-000c2989577c) из значения SQL binary поля IDRRef (вида 0x8DDE000C2989577C11E17D649299C542)
RETURNS nchar(36)
BEGIN
declare @IDRRef_String nchar(32);
SET @IDRRef_String = substring(sys.fn_sqlvarbasetostr(@IDRRef),3,32);
RETURN(
  substring(@IDRRef_String,25,8) + '-' +
  substring(@IDRRef_String,21,4) + '-' +
  substring(@IDRRef_String,17,4) + '-' +
  substring(@IDRRef_String,1,4) + '-' +
  substring(@IDRRef_String,5,12)
  );
END;
GO
Показать


Для работы необходимо запустить код на сервере, в результате создастся функция в нужной базе. После чего к ней можно будет обращаться, как в примере на скриншоте.
Прикрепленные файлы:
maksi_ko; kwazi; kalyaka; WolfKgn; 7OH; Byteon1C; triviumfan; +7
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. zhichkin 1455 22.04.20 18:16 Сейчас в теме
(1) DECLARE *uuid_1c binary(16) =
CAST(REVERSE(SUBSTRING(*uuid_sql, 9, 8)) AS binary(8))
+ SUBSTRING(*uuid_sql, 1, 8);
+
2. МихаилМ 26.12.17 18:48 Сейчас в теме
а зачем ф-ция fn_sqlvarbasetostr ?
+
3. aviconsult 48 26.12.17 22:23 Сейчас в теме
позволяет преобразовать binary в строку, здесь код http://www.sqlservercurry.com/2010/03/convert-binary-to-string-in-sql-server.html
+
4. Shaka13 29.08.18 10:35 Сейчас в теме
(3)а разве convert не проще использовать?
+
5. aviconsult 48 31.08.18 00:10 Сейчас в теме
(4) а конверт это может?
+
6. user1081738 02.11.18 17:15 Сейчас в теме
Вариант решения:

[1C-CODE]
sel ect top 10
convert( uniqueidentifier, t._IDRRef ) as Ref_ID,
fr om dbo.[_Document838] as t

См. подробнее: uniqueidentifier (Transact-SQL)
+
7. aviconsult 48 24.05.19 11:35 Сейчас в теме
(6)
sel ect top 10
convert( uniqueidentifier, t._IDRRef ) as Ref_ID,
fr om dbo.[_Document838] as t


Попробовали, Ваш вариант не возвращает GUID 1С, а возвращает что-то другое, возможно, это то как раньше GUID генерировался, выше писали, что правила его формирования несколько раз менялись. Результат проверки:
Это binary которое хранится в БД SQL --0x877B1008B1715F6811E573E62CC04775
Это то, что возвращает Get_1C_GUID_From_IDRRef --2cc04775-73e6-11e5-877b-1008b1715f68
А это то, что возвращает Ваш вариант convert( uniqueidentifier, t._IDRRef ) --08107B87-71B1-685F-11E5-73E62CC04775
Как видите группы символов переставлены в Вашем случае иначе чем у нас, соответственно у Вас не получится GUID для 1С.
+
8. user612295_death4321 16.09.19 09:33 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот