Хранимка для перевода уникального идентификатора (УИ) в виде строки в бинари 16:
// CREATE FUNCTION [dbo].[UID2Binary]
//(
// @p1 char(36)
//)
//RETURNS binary(16)
//AS
//BEGIN
// DECLARE @Result binary(16)
// SELECT @Result =
// CAST(CAST(( SUBSTRING(@p1,25,2)+
// SUBSTRING(@p1,27,2)+
//
// SUBSTRING(@p1,22,2)+
// SUBSTRING(@p1,20,2)+'-'+
//
// SUBSTRING(@p1,31,2)+
// SUBSTRING(@p1,29,2)+'-'+
//
// SUBSTRING(@p1,33,2)+
// SUBSTRING(@p1,35,2)+'-'+
//
// SUBSTRING(@p1,15,4)+'-'+
// SUBSTRING(@p1,10,4)+
// SUBSTRING(@p1,1,8)) as uniqueidentifier) as binary(16))
//
// RETURN @Result
//END
Функцию придумал не я, а позаимствовал с какого форума. Но ее пришлось доработать, она отказывалась работать, поле того, как разобрался - оказалось, что необходимо поменять местами вырезки из строки. После этого функция заработала.
Пример применения:
Подключаемся к другой базе SQL, находим в ней по УИ SQL объект - документ (преобразовав УИ из базы в УИ SQL вызвав хранимку: dbo.UID2Binary('"+Уи+"')), а в найденном документе получаем значение реквизита (rs.Fields(1).Value.GetValue(0)).
Conn = Новый COMОбъект ("ADODB.Connection");
Conn.CommandTimeOut = 300;
Попытка
Conn.Open("
|Provider=SQLOLEDB;
|Data Source =buh;
|Server= buh;
|Uid=1c;
|Pwd=-------;
|Database=-------;
|");
Исключение
#Если клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Возврат Истина;
КонецПопытки;
Если Ссылка.Метаданные().Имя = "ПоступлениеТоваровУслуг" Тогда
ИмяТаблицы = "_Document465";
Фл = "_Fld3113";
ИначеЕсли Ссылка.Метаданные().Имя = "ОприходованиеТоваров" Тогда
ИмяТаблицы = "_Document407";
Фл = "_Fld9783";
ИначеЕсли Ссылка.Метаданные().Имя = "СписаниеТоваров" Тогда
ИмяТаблицы = "_Document525";
Фл = "_Fld15400";
ИначеЕсли Ссылка.Метаданные().Имя = "ПеремещениеТоваров" Тогда
ИмяТаблицы = "_Document434";
Фл = "_Fld10962";
иначе
Возврат Истина;
КонецЕсли;
ТекстЗапроса = "
|SELECT dbo.getStringUUID(_IDRRef), "+Фл+"
|FROM "+ ИмяТаблицы +"
|WHERE (_IDRRef = dbo.UID2Binary('"+Уи+"'))";
RS = Новый COMОбъект ("ADODB.RecordSet");
RS.Open(ТекстЗапроса, Conn);
Пока rs.Eof()=0 Цикл
Возврат ?(rs.Fields(1).Value.GetValue(0)=1,Истина,Ложь);
rs.MoveNext();
КонецЦикла;
В итоге получаем зависимость от того, выставлен ли флаг "отражать в бухгалтерском учете" или нет.
// CREATE FUNCTION [dbo].[UID2Binary]
//(
// @p1 char(36)
//)
//RETURNS binary(16)
//AS
//BEGIN
// DECLARE @Result binary(16)
// SELECT @Result =
// CAST(CAST(( SUBSTRING(@p1,25,2)+
// SUBSTRING(@p1,27,2)+
//
// SUBSTRING(@p1,22,2)+
// SUBSTRING(@p1,20,2)+'-'+
//
// SUBSTRING(@p1,31,2)+
// SUBSTRING(@p1,29,2)+'-'+
//
// SUBSTRING(@p1,33,2)+
// SUBSTRING(@p1,35,2)+'-'+
//
// SUBSTRING(@p1,15,4)+'-'+
// SUBSTRING(@p1,10,4)+
// SUBSTRING(@p1,1,8)) as uniqueidentifier) as binary(16))
//
// RETURN @Result
//END
Функцию придумал не я, а позаимствовал с какого форума. Но ее пришлось доработать, она отказывалась работать, поле того, как разобрался - оказалось, что необходимо поменять местами вырезки из строки. После этого функция заработала.
Пример применения:
Подключаемся к другой базе SQL, находим в ней по УИ SQL объект - документ (преобразовав УИ из базы в УИ SQL вызвав хранимку: dbo.UID2Binary('"+Уи+"')), а в найденном документе получаем значение реквизита (rs.Fields(1).Value.GetValue(0)).
Conn = Новый COMОбъект ("ADODB.Connection");
Conn.CommandTimeOut = 300;
Попытка
Conn.Open("
|Provider=SQLOLEDB;
|Data Source =buh;
|Server= buh;
|Uid=1c;
|Pwd=-------;
|Database=-------;
|");
Исключение
#Если клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Возврат Истина;
КонецПопытки;
Если Ссылка.Метаданные().Имя = "ПоступлениеТоваровУслуг" Тогда
ИмяТаблицы = "_Document465";
Фл = "_Fld3113";
ИначеЕсли Ссылка.Метаданные().Имя = "ОприходованиеТоваров" Тогда
ИмяТаблицы = "_Document407";
Фл = "_Fld9783";
ИначеЕсли Ссылка.Метаданные().Имя = "СписаниеТоваров" Тогда
ИмяТаблицы = "_Document525";
Фл = "_Fld15400";
ИначеЕсли Ссылка.Метаданные().Имя = "ПеремещениеТоваров" Тогда
ИмяТаблицы = "_Document434";
Фл = "_Fld10962";
иначе
Возврат Истина;
КонецЕсли;
ТекстЗапроса = "
|SELECT dbo.getStringUUID(_IDRRef), "+Фл+"
|FROM "+ ИмяТаблицы +"
|WHERE (_IDRRef = dbo.UID2Binary('"+Уи+"'))";
RS = Новый COMОбъект ("ADODB.RecordSet");
RS.Open(ТекстЗапроса, Conn);
Пока rs.Eof()=0 Цикл
Возврат ?(rs.Fields(1).Value.GetValue(0)=1,Истина,Ложь);
rs.MoveNext();
КонецЦикла;
В итоге получаем зависимость от того, выставлен ли флаг "отражать в бухгалтерском учете" или нет.