1. aviconsult 18 26.12.17 16:46 Сейчас в теме

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

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
Показать


Для работы необходимо запустить код на сервере, в результате создастся функция в нужной базе. После чего к ней можно будет обращаться, как в примере на скриншоте.
Прикрепленные файлы:
Margarita_parsek; triviumfan; +2 Ответить
Ответы
Избранное Подписка Сортировка: Древо
2. МихаилМ 26.12.17 18:48 Сейчас в теме
а зачем ф-ция fn_sqlvarbasetostr ?
3. aviconsult 18 26.12.17 22:23 Сейчас в теме
4. Shaka13 29.08.18 10:35 Сейчас в теме
(3)а разве convert не проще использовать?
5. aviconsult 18 31.08.18 00:10 Сейчас в теме
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 18 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С.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день