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

08.10.10

Разработка - Запросы

Выполнение параметризованных SQL запросов по OLE из 1С 8.x в 1С 7.7
Показан алгоритм как можно выполнить данный вид запросов

Всем привет.

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

 

Традиционное сильно не пинайте Cool

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    176851    980    403    

939

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    1675    10    XilDen    24    

35

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    12311    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    7321    XilDen    36    

88

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9955    user1840182    5    

29

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2985    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    11733    implecs    6    

48
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. anton.fly7 175 08.10.10 10:04 Сейчас в теме
круть!
а с DBF подобное прокатит?
получать можно только строковые данные? получить карточку например номенклатуры или документ из 77 в 8 не получится?
2. Попытка1С 13 08.10.10 10:19 Сейчас в теме
(1) Мне думается что таким способом можно использовать класс ПрямойЗапрос, и 1sqlite.dll. Запрос будет работать и в dbf версии. Постараюсь в ближайшее время проверить.

3. anton.fly7 175 08.10.10 10:22 Сейчас в теме
(2) я имею ввиду что все значения на выходе из 1с77 надо приводить к строке или числу или дате, остальные данные типа элемента справочника не получить?
4. Попытка1С 13 08.10.10 10:30 Сейчас в теме
(3) Возможно можно будет получить OLE объект если всю процедуру выполнить через evalexpr(). Нужно проверять.
5. Арчибальд 2709 08.10.10 11:02 Сейчас в теме
(4) Проверяй! Но плюс от меня уже есть.
6. Попытка1С 13 08.10.10 11:21 Сейчас в теме
Оставьте свое сообщение