Как получить значение ссылки на уровне sql?

1. info1i 236 01.04.13 15:00 Сейчас в теме
В коде пишу sql-запрос:
Sc.ConnectionString=СтрПодкл;
	Sc.Open();	
	TablSource = "_Reference6035";
	//Формирование условия запроса
	УсловиеЗапроса=" WHERE [_Fld6040]=1 AND [_FLD6036]>'"+ДатаПередачи+"'"+" AND [_Fld6037RRef]="+IDПолучатель;	
	Quiry = Sc.Execute("Select [_IDRRef] FROM dbo." + TablSource + УсловиеЗапроса);
	
	While Quiry.EOF()=False Do                     
		сп.Добавить(Quiry.Fields("_IDRRef").Value);
		Quiry.MoveNext();    
	Enddo;
	Sc.Close();
Показать

Есть ссылка получателя, нужно получить значение IDПолучателя из _IDRRef.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. logos 214 01.04.13 15:03 Сейчас в теме
Есть 2 мнения:
1) Можно переставить местами блоки GUIDа, например, из XMLСтрока(<Какая то ссылка в БД>)
2) Метод из (1) может иногда косячить и пользоваться им нельзя.

Верить (2) или нет - решать Вам.
6. cool.vlad4 2 01.04.13 15:26 Сейчас в теме
(1) info1i,
CREATE function [dbo].[sp_getbinaryid] (@unidentifier char(36)) 
returns binary(16) 
as 
begin 
declare @binvalue varbinary(8000)
declare @hexstring varchar(8000)
declare @sqlstring nvarchar(1000)
select @hexstring = '0x'+ 
substring(@unidentifier,20,4)
+right(@unidentifier,12) 
+substring(@unidentifier,15,4) 
+substring(@unidentifier,10,4)  
+left(@unidentifier, 8)
select @binvalue = CONVERT(varbinary(max), @hexstring, 1) 
return ( @binvalue ) 
Показать

вот так попробуй. и мне ответь.
8. info1i 236 01.04.13 15:48 Сейчас в теме
(6) cool.vlad4, На сервере отдельно нельзя ничего делать. А засунуть этот код в модуль слишком громоздко, к тому же он создает новое, а у меня задача получить существующее значение.
14. cool.vlad4 2 01.04.13 15:53 Сейчас в теме
(8) чего новое? использовать это в запросе ты не можешь, что ли? или перевести на 1С код?
3. romansun 194 01.04.13 15:16 Сейчас в теме
ЗначениеВСтрокуВнутр посмотрите
5. info1i 236 01.04.13 15:19 Сейчас в теме
(3) romansun, ЗначениеВСтрокуВнутр возвращает строку, а _IDRRef является бинарным.
4. cool.vlad4 2 01.04.13 15:17 Сейчас в теме
я так понимаю это [_Fld6037RRef] - ссылка и соответственно тип binary? Я вот например, не знаю как и строки в ms sql сделать так просто binary, хотя способы наверняка имеются (google в помощь), но я делал иначе, я на стороне sql делал уникальныйидентификатор
CREATE function [dbo].[sp_getid] (@id binary(16)) 
returns char(36) 
as 
begin 
declare @unidentifier char(36) 
declare @charvalue char(36) 
select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
select @charvalue = 
right(@unidentifier, 8) 
+ substring(@unidentifier,24,5) 
+ substring(@unidentifier,19,5) 
+ '-' 
+ substring(@unidentifier,7,2) 
+ substring(@unidentifier,5,2) 
+ '-' 
+ substring(@unidentifier,3,2) 
+ left(@unidentifier,2) 
+ substring(@unidentifier,12,2) 
+ substring(@unidentifier,10,2) 
+ substring(@unidentifier,17,2) 
+ substring(@unidentifier,15,2) 

return ( @charvalue ) 
end 
Показать

получится [dbo].[sp_getid]([_Fld6037RRef])="+УникальныйИдентиифкаторЧегоТо
triviumfan; Pryanishnikov_Vladimir; +2 Ответить
24. logos 214 01.04.13 16:12 Сейчас в теме
(4) cool.vlad4,
select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier))
вот на этом вызове можно было уже закончить. В переменной @unidentifier уже находится GUID, нужный 1Су.
romansun; +1 Ответить
26. info1i 236 01.04.13 16:17 Сейчас в теме
(24) logos, Считаете, что Ваш метод оптимальней? ОК, только я не пойму, как ваш код пристроить к моему. Напишете?
28. logos 214 01.04.13 16:22 Сейчас в теме
(26) info1i, Вам наверное нужно преобразование из (27).
IDПолучатель = XMLСтрока(КакаятоСсылка);
УсловиеЗапроса=" WHERE [_Fld6040]=1 AND [_FLD6036]>'"+ДатаПередачи+"'"+" AND [_Fld6037RRef]=cast(cast('"+IDПолучатель+"'as uniqueidentifier) as binary(16))";
Где то так.
31. cool.vlad4 2 01.04.13 16:52 Сейчас в теме
(24) я чего-то не понял, проверил и нифига не работает. может мы про разные вещи говорим. на выходе в (4) получается УникальныйИдентификатор объекта, например Справочники.Справочник.НайтиПоКоду("Код").УникальныйИдентификатор()
33. logos 214 01.04.13 17:04 Сейчас в теме
(31) cool.vlad4, (24):
declare @temp binary(16)
set @temp = 0x1234567890abcdef1234567890abcdef
select [sys].[fn_varbintohexstr](@temp)
select convert(char(36),cast(@temp as uniqueidentifier))
возвращает:
78563412-AB90-EFCD-1234-567890ABCDEF
Что в принципе и есть GUID.
(32) cool.vlad4, Конечно поняли, просто предложили более лаконичный вариант.
DennyPhilord; invertercant; cool.vlad4; info1i; +4 Ответить
43. Pavel_Vladivostok 58 23.03.16 05:27 Сейчас в теме
(33) logos,
Проверил на своей УПП, полученные таким образом гуиды объектов не совпадают с теми что выдает для этих же объектов 1С.
например, если в представлении таблицы базы 1С для поля ссылка ввести выражение
convert(char(36),cast(_IDRRef as uniqueidentifier)) - В 1С будет один гуид, а в данной ссылке другой.
Как бы в запросе sql получить гуиды которые отображает для объектов сама 1С?!
lesenoklenok; +1 Ответить
7. cool.vlad4 2 01.04.13 15:27 Сейчас в теме
если у тебя ms sql, конечно и версии повыше, чем 2005 (на ней по моему не сработает)
9. logos 214 01.04.13 15:49 Сейчас в теме
Конверт с кастом не катят, они пытаются преобразовать бинарные данные в текст по кодам символов. Тут нужно предварительно употребить более сильное колдунство:
[sys].[fn_varbintohexstr] и [sys].[fn_varbintohexsubstring] конвертируют варчар и бинари туда и обратно. После получения строки можно уже кромсать сабстрингами.
10. logos 214 01.04.13 15:50 Сейчас в теме
А громоздкого ничего нет, создается функция, которая обрабатывает идшник, переданный в виде строки, конвертирует его в бинари. И эта функция, в свою очередь, вызывается в запросе.
11. cool.vlad4 2 01.04.13 15:52 Сейчас в теме
(10) на 2012 серваке вроде как катит, я проверил. на 2005 , по всей видимости да, не катит, как я и сказал. в любом случае можно использовать (хоть это и нагрузка) из (4) .
13. logos 214 01.04.13 15:53 Сейчас в теме
(11) cool.vlad4, тестировал свои функции на 2008. Работает. Или Вы про свой код?
15. cool.vlad4 2 01.04.13 15:53 Сейчас в теме
12. cool.vlad4 2 01.04.13 15:52 Сейчас в теме
(10) ну напиши. я не хочу на это тратить время.
16. logos 214 01.04.13 15:57 Сейчас в теме
(12) cool.vlad4, Нет, вру. Конвертация через uniqueidentifier корректно отрабатывает. Приношу свои извинения.
cool.vlad4; +1 Ответить
17. info1i 236 01.04.13 16:06 Сейчас в теме
(12) cool.vlad4, Не оптимально.
18. romansun 194 01.04.13 16:06 Сейчас в теме
чего-то я не понял.. а зачем именно бинари?

AND [_Fld6037RRef]='0x"+ "732547238 бла-бла-ба"+ "'"


а если новая - то NewId()

или я опять не понял? :)
19. logos 214 01.04.13 16:09 Сейчас в теме
(18) romansun, Fld6037RRef - это binary, не char.
21. info1i 236 01.04.13 16:10 Сейчас в теме
(19) logos, Да, точно, тоже забыл.
23. info1i 236 01.04.13 16:12 Сейчас в теме
(21) info1i,(19) logos, Хотя нет, все-таки можно. Здесь http://habrahabr.ru/post/164913/ посмотрел как. Осталось получить "бла-бла"
romansun; +1 Ответить
25. romansun 194 01.04.13 16:16 Сейчас в теме
(23)

ну да

"Полученный ID имеет примерно такой вид: 0xa8ed00221591466911e17da9fd549878
В запросе мы его можем сравнивать как строку

where master.dbo.fn_varbintohexstr(_fld1234RRef) = '0xa8ed00221591466911e17da9fd549878'

Но в таком случае запрос будет отрабатывать дольше. Так как на преобразование в строку тоже нужно время"

насчет падения производительности - не скажу... мне было не настолько критично
27. logos 214 01.04.13 16:18 Сейчас в теме
(23) info1i,
И обратное преобразование:
select cast(cast(@guid as uniqueidentifier) as binary(16))
Где @guid - строка ссылки, полученная через XMLСтрока(Ссылка)
20. info1i 236 01.04.13 16:09 Сейчас в теме
(18) romansun, Вот это уже более подходящее. Только откуда взять "732547238 бла-бла-ба"+ "'" ? Как это "бла-бла" получить?
22. romansun 194 01.04.13 16:11 Сейчас в теме
(20)

ЗначениеВСтрокуВнутр же ))))

поглядите мои вирши

http://infostart.ru/public/80438/
http://infostart.ru/public/85473/
29. info1i 236 01.04.13 16:42 Сейчас в теме
Первый способ:
IDПолучатель="0x"+ЗначениеВСтрокуВнутр(СсылкаПолучатель);
Не прошло. Ошибка синтаксиса.
romansun, поправьте мой синтаксис, если не так.
30. romansun 194 01.04.13 16:49 Сейчас в теме
(29)
не, ну не так в лоб же )))

ЗначениеВСтрокуВнутр дает вид

"{"#", 54c3544f-651b-4887-ae3a-2df362efbacb, 9659:ab2b001b78e134e011dfec0814418025}"

из которого нужно выдрать выделенное - это и есть ссылка, собственно... к нему и присобачиваем "0x", а 9659 - это номер референса, кстати (ну это так, для информации)
32. cool.vlad4 2 01.04.13 16:54 Сейчас в теме
(30) ну, а я собственно предлагал брать УникальныйИдентификатор и приводить его к виду ab2b001b78e134e011dfec0814418025 и наоборот. видимо меня не поняли.
34. info1i 236 01.04.13 17:24 Сейчас в теме
Итак, написал первым способом:
СправаСоСкобкой=Прав(ЗначениеВСтрокуВнутр(СсылкаПолучатель), 33);
СсылкаБезСкобки=Лев(СправаСоСкобкой, 32);
IDПолучатель="0x"+СсылкаБезСкобки;

Sc.Open();	
	TablSource = "_Reference6035";
	//Формирование условия запроса
	УсловиеЗапроса=" WHERE [_Fld6040]=1 AND [_FLD6036]>'"+ДатаПередачи+"'"+" AND [_Fld6037RRef]="+IDПолучатель;	
	Quiry = Sc.Execute("Select [_IDRRef] FROM dbo." + TablSource + УсловиеЗапроса);
	
	While Quiry.EOF()=False Do                     
		сп.Добавить(Quiry.Fields("_IDRRef").Value);
		Quiry.MoveNext();    
	Enddo;
	Sc.Close();
		 
	//Перебор списка значений и преобразование значения в строку
	Для Номер = 1 По Сп.Количество() Цикл
		значение = Сп.ПолучитьЗначение(Номер); //получить значение и представление		
		ID= новый УникальныйИдентификатор(значение);
		//Затем получаем ссылку нужного типа:
		ссылка = Справочники.Сообщения.ПолучитьСсылку(ID);
	КонецЦикла; 	
Показать

Итак, компактный код, и работает мгновенно. Теперь остается в последнем цикле полученные значения преобразовать в ссылки. Написал примерно так, но метода ПолучитьЗначение(Номер) не существует. Какие здесь варианты?
35. cool.vlad4 2 01.04.13 17:36 Сейчас в теме
(34) кастуй idref в строку, дальше преобразуй либо как тебе говорили к виду Значения в строку внутр (что бы сделать ЗначениеИзСтрокиВнутр), либо к Уникальному идентификатору. Если бы использовал ф-цию из (4) , тебе вообще ни пришлось ничего делать. Получил бы УникальныйИдентификатор и все, вот почему я её использую.
romansun; info1i; +2 Ответить
36. romansun 194 01.04.13 17:40 Сейчас в теме
(34)

если тип знаете (т.е. какой справочник конкретно) то преобразовывайте через ЗначениеИзСтрокиВнутр, предварительно получив "шаблон" строки-аргумента для, скажем, пустой ссылки справочника командой ЗначениеВСтрокуВнутр(ПустаяСсылка)

а затем уже, подменяя 0x00000... получаете

ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}").

но, если ссылка произвольная, то можно перебором по метаданным

я вот здесь писал обработку такую - ищет любую ссылку


также можно поиграться с УникальныйИдентификатор(), ПолучитьСсылку (или как там?..) и всё в таком духе - но мне такой путь импонирует меньше, т.к. чуть тормознее работает

ну, вот в (35) ваще халявный способ - сразу ГУИД, да

Мне чем нравится ЗначениеВ..-ЗначениеИз.. - скуль не нужен
invertercant; cool.vlad4; +2 Ответить
37. info1i 236 01.04.13 17:52 Сейчас в теме
(36) romansun, Справочник известен. Можете код подмены написать?
38. romansun 194 01.04.13 18:27 Сейчас в теме
эээ.. как-то так

внутреннее_представление = ЗначениеВСтрокуВнутр(Справочник.Сообщения.ПустаяСсылка());
наше_представление = СтрЗаменить(внутреннее_представление,"00000000000000000000000000000000", СсылкаБезСкобки);
наша_ссылка = ЗначениеИзСтрокиВнутр(наше_представление);
39. info1i 236 02.04.13 10:06 Сейчас в теме
(38) romansun, Объект не найден. В значении наша_ссылка. Т.е. так не сработало.
40. info1i 236 02.04.13 14:20 Сейчас в теме
(39) info1i, А, все, не тот объект вставил.
Но в этом коде:
While Quiry.EOF()=False Do                     
		сп.Добавить(Quiry.Fields("_IDRRef").Value);		
		Quiry.MoveNext();    
	Enddo;
	Sc.Close();

не добавляется 16-ричное значение, как оно должно быть(0xблаблабла), а вставляется ComSafeArray. Как получить все-таки 16-ричное? Или вид ее строки?
41. cool.vlad4 2 02.04.13 14:23 Сейчас в теме
(40) говорили же, что надо преобразовать binary.
Select [sys].[fn_varbintohexstr]([_IDRRef]) FROM dbo.
ilego; info1i; +2 Ответить
42. info1i 236 02.04.13 14:39 Сейчас в теме
(41) cool.vlad4, Работает! Плюс!
44. atulukin 8 17.05.16 09:13 Сейчас в теме
Нашел способ преобразовать GUID, который выдает MS SQL и который выдает 1С
На примере
MS SQL
89ee7bb0-0fab-e5c7-4f44-96aeffe0c13c

ffe0c13c-96ae-4f44-b07b-ee89ab0fc7e5

Функция Преобразования (на входе строка гуида MS SQL, на выходе строка ГУИДа 1С)

возврат НРЕГ( прав(стр,8)
+"-"+сред(стр,25,4)
+"-"+сред(стр,20,4)
+"-"+сред(стр,7,1) +сред(стр,8,1) +сред(стр,5,1) +сред(стр,6,1)
+"-"+сред(стр,3,1) +сред(стр,4,1) +сред(стр,1,1) +сред(стр,2,1)
+сред(стр,12,1)+сред(стр,13,1)+сред(стр,10,1)+сред(стр,11,1)
+сред(стр,17,1)+сред(стр,18,1)+сред(стр,15,1)+сред(стр,16,1))
47. Boris-Leleko 318 07.10.22 18:19 Сейчас в теме
(44)
89ee7bb0-0fab-e5c7-4f44-96aeffe0c13c


не работает. Проверил
45. rusak171 24.06.16 13:28 Сейчас в теме
может кому пригодится, всякие проверки в методах лень было писать

// Преобразует строку УИДа в строку GUID'а
//
Функция ПолучитьGUIDПоУИД(Знач УИД) Экспорт
	
	УИД_0 = СтрЗаменить(УИД, "-", "");
	GUID  = "0x" + ВРег(Сред(УИД_0, 17, 4) + Прав(УИД_0, 12) + Сред(УИД_0, 13, 4) + Сред(УИД_0, 9, 4) + Лев(УИД_0, 8));
		
	Возврат GUID; 
	
КонецФункции



// Преобразует строку GUID'а в строку УИДа
//
Функция ПолучитьУИДПоGUID(Знач GUID) Экспорт
	
	GUID = Прав(GUID, СтрДлина(GUID) - 2);
	УИД = НРег(Строка(Прав(GUID, 8) + "-" + Сред(GUID, 21, 4) + "-" + Сред(GUID, 17, 4) + "-" + Лев(GUID, 4)  + "-" + Сред(GUID, 5, 12)));
	
	Возврат УИД;
	
КонецФункции 
Показать
webester; CratosX; miaso; +3 Ответить
46. SlavaKron 19.01.18 12:16 Сейчас в теме
Этот код работает намного быстрее, чем fn_varbintohexstr()

&НаКлиенте
Перем Ч;

&НаКлиенте
Процедура Сформировать(Команда)	

	Соединение = Новый COMОбъект("ADODB.Connection");
	СтрокаПодключения = "Provider=SQLOLEDB;Server=" + СерверSQL + ";DataBase=" + БазаSQL + ";User ID=" + ПользовательSQL + ";Password=" + Пароль + ";";
	Попытка
		Соединение.Open(СтрокаПодключения);
	Исключение
		Соединение = Неопределено;
		Возврат
	КонецПопытки;
	
	ТекстЗапроса =
	"SELECT
	|	_RecorderRRef
	|FROM
	|	_AccRg474";
	
	Выборка = Соединение.Execute(ТекстЗапроса);
	Если Выборка.EOF() <> 0 Тогда
		Соединение.Close();
		Соединение = Неопределено;
		Возврат		
	КонецЕсли;
	
	Данные = Выборка.GetRows().Выгрузить();
	Соединение.Close();
	Соединение = Неопределено;
	Выборка = Неопределено;
	
	Для Каждого Стр Из Данные Цикл
		А = Стр[0];
		СтрокаУИД = Ч[А[12]] + Ч[А[13]] + Ч[А[14]] + Ч[А[15]] + "-" + Ч[А[10]] + Ч[А[11]] + "-" + Ч[А[8]] + Ч[А[9]] + "-" + Ч[А[0]] + Ч[А[1]] + "-" + Ч[А[2]] + Ч[А[3]] + Ч[А[4]] + Ч[А[5]] + Ч[А[6]] + Ч[А[7]];
	КонецЦикла;
		
КонецПроцедуры


Ч = Новый Массив(256);
Символы16 = "0123456789abcdef";
Для Сч = 0 По 255 Цикл
	Ч[Сч] = Сред(Символы16, Цел(Сч / 16) + 1, 1) + Сред(Символы16, Сч % 16 + 1, 1)
КонецЦикла;
Показать
Прикрепленные файлы:
ШаблонSQLУФ.epf
Оставьте свое сообщение

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