Всем привет.
Стояла задача получить подходящий номер ГТД и страну из базы ТиС 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
Традиционное сильно не пинайте