Выполнение параметризированных SQL запросов по OLE из 1С 8.x в 1С 7.7 Ключевые слова: SQL, запросы, OLE.
 
  Всем привет.
 Стояла задача получить подходящий номер ГТД и страну из базы ТиС 7.7 по коду товара в Бухгалтерии 
 8.1.
 Для этого был написан SQL запрос для выполнения внутри базы 7.7.
 После чего встала проблема как его выполнить на стороне 7.7 и вернуть в 8.1. Можно было переписать 
 запрос на стандартный запрос 7.7 и выполнить его по OLE но в плане производительности такое решение 
 наверное худшее из существующих. Ко всему прочему нужно было получать нужные параметры по нескольким 
 товарам.
 Для решения данной задаче я попытался сделать аналог параметризированного запроса 7.7 но с 
 выполнением из 8.1 по OLE.
 Суть параметризированных запросов в том, что компиляция происходит один раз, и далее в цикле 
 меняются нужные параметры (переменные) запроса, за счет чего достигается выигрыш в скорости.
 Т.е. запрос состоит из двух шагов.
 - Инициализация запроса т.е. его подготовка;
 - Подстановка параметров и выполнение.
  В моем случае параметром будет код товара из 8.1
 Для того чтобы иметь возможность выполнять прямой запрос в базе 7.7 должна быть загружена компонента 
 1cpp.dll.
 Соответственно в 7.7 в глобальном модуле должна присутствовать строка к примеру такого вида:
 ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "1cpp.dll") 
 Перейдем к написанию модуля в 8.1.
 1.      При открытии обработки инициализируем запрос.
 Процедура ПриОткрытии()
    Инициализация_Получить_ТабРез_Из_77();
 КонецПроцедуры 
 //**************************************************************************
 Функция Инициализация_Получить_ТабРез_Из_77()
        БазаИсточникOLE = Новый COMОбъект("V77.Application");
        Если не БазаИсточникOLE.Initialize(БазаИсточникOLE.RMTrade, "/D""" +  """ /N" +  " /P"  , 
 "No_Splash_Show") Тогда
              Предупреждение("База не открыта. Ошибка подключения!");
              Возврат 0;
        КонецЕсли;
        ТекстЗапроса = "
        |Set NOCOUNT ON
        |Declare @Номенклатура VarChar(9)
        |Declare @КодНоменклатуры VarChar(10)
        |
        |Set @КодНоменклатуры = ?
        |Set @Номенклатура = (Select СпрНом.ID From $Справочник.Номенклатура as СпрНом (NOLOCK) 
        |Where СпрНом.Code = @КодНоменклатуры)
        |
        |SELECT TOP 1
        |  ГТД1.DESCR as Наименование
        |,$ГТД1.СтранаПроисхождения as СтранаПроисхождения
        |FROM $Справочник.ГТД1 AS ГТД1 (NOLOCK)
        |INNER JOIN $Справочник.Номенклатура AS Номенклатура ON ГТД1.PARENTEXT = Номенклатура.ID
        |WHERE (Номенклатура.ID = @Номенклатура) AND (ГТД1.DESCR <> '')
        |";
        Запрос77=БазаИсточникOLE.CreateObject("ODBCRecordset");
        Запрос77.Подготовить(ТекстЗапроса);
        Запрос77.ДобПараметр(1,14,10,0);
        Запрос77.ДобПараметр(1,14,9,0);
 КонецФункции 
 2.      Напишем функцию подстановки параметра и выполнения запроса, с возвратом результата.
 Функция Получить_ТабРез_Из_77(КодТовара)
        Запрос77.УстПараметр(1,КодТовара);
        Рез = Запрос77.ВыполнитьСкалярный();
     Возврат Рез;
 КонецФункции  
 В данном случае запрос вернет структуру, так я выбираю несколько значений, номер гтд и страну.
 3.      Сформируем пробный массив данных с кодами товаров, и получим требуемые данные для наших 
 кодов. (понятно что это может быть перебор любой коллекции значений)
  
 Процедура КнопкаВыполнитьНажатие(Кнопка)
        Массив = Новый Массив;
        Массив.Вставить(0,"77426");
        Массив.Вставить(1,"81124");
        Для каждого стрМассив Из Массив Цикл
              а = Получить_ТабРез_Из_77(стрМассив);
              Сообщить(а.Наименование + " " + а.СтранаПроисхождения);
        КонецЦикла;
 КонецПроцедуры 
 Компонента 1сpp.dll доступна для скачивания тут http://1cpp.ru/index.php/Download
 FAQ по прямым запросам тут http://www.1cpp.ru/forum/YaBB.pl?num=1148038411 |