вторник, 21 августа 2012 г.

Хранимка для перевода уникального идентификатора (УИ) в виде строки в бинари 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();
         КонецЦикла;

В итоге получаем зависимость от того, выставлен ли флаг "отражать в бухгалтерском учете" или нет.