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 мнения:
1) Можно переставить местами блоки GUIDа, например, из XMLСтрока(<Какая то ссылка в БД>)
2) Метод из (1) может иногда косячить и пользоваться им нельзя.
(6) cool.vlad4, На сервере отдельно нельзя ничего делать. А засунуть этот код в модуль слишком громоздко, к тому же он создает новое, а у меня задача получить существующее значение.
я так понимаю это [_Fld6037RRef] - ссылка и соответственно тип binary? Я вот например, не знаю как и строки в ms sql сделать так просто binary, хотя способы наверняка имеются (google в помощь), но я делал иначе, я на стороне sql делал уникальныйидентификатор
(4) cool.vlad4,
select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier))
вот на этом вызове можно было уже закончить. В переменной @unidentifier уже находится GUID, нужный 1Су.
(26) info1i, Вам наверное нужно преобразование из (27).
IDПолучатель = XMLСтрока(КакаятоСсылка);
УсловиеЗапроса=" WHERE [_Fld6040]=1 AND [_FLD6036]>'"+ДатаПередачи+"'"+" AND [_Fld6037RRef]=cast(cast('"+IDПолучатель+"'as uniqueidentifier) as binary(16))";
Где то так.
(24) я чего-то не понял, проверил и нифига не работает. может мы про разные вещи говорим. на выходе в (4) получается УникальныйИдентификатор объекта, например Справочники.Справочник.НайтиПоКоду("Код").УникальныйИдентификатор()
(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, Конечно поняли, просто предложили более лаконичный вариант.
43.
Pavel_Vladivostok
5823.03.16 05:27 Сейчас в теме
(33) logos,
Проверил на своей УПП, полученные таким образом гуиды объектов не совпадают с теми что выдает для этих же объектов 1С.
например, если в представлении таблицы базы 1С для поля ссылка ввести выражение
convert(char(36),cast(_IDRRef as uniqueidentifier)) - В 1С будет один гуид, а в данной ссылке другой.
Как бы в запросе sql получить гуиды которые отображает для объектов сама 1С?!
Конверт с кастом не катят, они пытаются преобразовать бинарные данные в текст по кодам символов. Тут нужно предварительно употребить более сильное колдунство:
[sys].[fn_varbintohexstr] и [sys].[fn_varbintohexsubstring] конвертируют варчар и бинари туда и обратно. После получения строки можно уже кромсать сабстрингами.
А громоздкого ничего нет, создается функция, которая обрабатывает идшник, переданный в виде строки, конвертирует его в бинари. И эта функция, в свою очередь, вызывается в запросе.
(10) на 2012 серваке вроде как катит, я проверил. на 2005 , по всей видимости да, не катит, как я и сказал. в любом случае можно использовать (хоть это и нагрузка) из (4) .
(23) info1i,
И обратное преобразование:
select cast(cast(@guid as uniqueidentifier) as binary(16))
Где @guid - строка ссылки, полученная через XMLСтрока(Ссылка)
из которого нужно выдрать выделенное - это и есть ссылка, собственно... к нему и присобачиваем "0x", а 9659 - это номер референса, кстати (ну это так, для информации)
(30) ну, а я собственно предлагал брать УникальныйИдентификатор и приводить его к виду ab2b001b78e134e011dfec0814418025 и наоборот. видимо меня не поняли.
СправаСоСкобкой=Прав(ЗначениеВСтрокуВнутр(СсылкаПолучатель), 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);
КонецЦикла;
Показать
Итак, компактный код, и работает мгновенно. Теперь остается в последнем цикле полученные значения преобразовать в ссылки. Написал примерно так, но метода ПолучитьЗначение(Номер) не существует. Какие здесь варианты?
(34) кастуй idref в строку, дальше преобразуй либо как тебе говорили к виду Значения в строку внутр (что бы сделать ЗначениеИзСтрокиВнутр), либо к Уникальному идентификатору. Если бы использовал ф-цию из (4) , тебе вообще ни пришлось ничего делать. Получил бы УникальныйИдентификатор и все, вот почему я её использую.
если тип знаете (т.е. какой справочник конкретно) то преобразовывайте через ЗначениеИзСтрокиВнутр, предварительно получив "шаблон" строки-аргумента для, скажем, пустой ссылки справочника командой ЗначениеВСтрокуВнутр(ПустаяСсылка)
но, если ссылка произвольная, то можно перебором по метаданным
я вот здесь писал обработку такую - ищет любую ссылку
также можно поиграться с УникальныйИдентификатор(), ПолучитьСсылку (или как там?..) и всё в таком духе - но мне такой путь импонирует меньше, т.к. чуть тормознее работает
ну, вот в (35) ваще халявный способ - сразу ГУИД, да
Мне чем нравится ЗначениеВ..-ЗначениеИз.. - скуль не нужен
Нашел способ преобразовать GUID, который выдает MS SQL и который выдает 1С
На примере
MS SQL
89ee7bb0-0fab-e5c7-4f44-96aeffe0c13c
1С
ffe0c13c-96ae-4f44-b07b-ee89ab0fc7e5
Функция Преобразования (на входе строка гуида MS SQL, на выходе строка ГУИДа 1С)