Книга знаний

1С:Предприятие / Приемы программирования / Обмен данными, УРБД

Выполнение параметризированных SQL запросов по OLE из 1С 8.x в 1С 7.7

Выполнение параметризированных SQL запросов по OLE из 1С 8.x в 1С 7.7
Показан алгоритм как можно выполнить данных вид запросов
Попытка1С
Последняя редакция №0 от 08.10.10
URL: http://kb.mista.ru/article.php?id=815

Ключевые слова: 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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика