Вход | Регистрация



1C 8 + Ole 7.7

1C 8 + Ole 7.7
Я
   plnz
 
16.11.18 - 10:25
Из восьмерки (обычные формы) по ОЛЕ подключаюсь к 7.7 и выполняю там запрос. Запрос выполняется очень долго (минут 10). Тот же самый запрос напрямую в 7.7 выполняется за доли секунды. В чем может быть причина?
 
 
   plnz
 
1 - 16.11.18 - 10:26
ВыбНачПериода = "01.01.2000";
ВыбКонПериода = База77.EvalExpr("ПолучитьДатуТА()");        
        
Результат = База77.EvalExpr("СкорректироватьСписок(1,1)");
Результат = База77.EvalExpr("СкорректироватьСписок(1,2, ""Справочник"", ""Изделия"", """ + Штрихкод + """)");
        
Запрос77 = База77.CreateObject("Запрос");
ТекстЗапроса ="
|Период с '"+ВыбНачПериода+ "' по '"+ВыбКонПериода+"';
|Фирма = Регистр.ОстаткиИзделий.Фирма;
|Номенклатура = Регистр.ОстаткиИзделий.Изделие;                                                                |ТекущийДокумент = Регистр.ОстаткиИзделий.ТекущийДокумент;
|Количество = Регистр.ОстаткиИзделий.Количество;
|Вес = Регистр.ОстаткиИзделий.Вес;
|Сумма = Регистр.ОстаткиИзделий.Сумма;
|Функция КоличествоНачОст = НачОст(Количество);
|Функция КоличествоПриход = Приход(Количество);
|Функция КоличествоРасход = Расход(Количество);
|Функция КоличествоКонОст = КонОст(Количество);
|Функция ВесНачОст = НачОст(Вес);
|Функция ВесПриход = Приход(Вес);
|Функция ВесРасход = Расход(Вес);
|Функция ВесКонОст = КонОст(Вес);
|Функция СуммаНачОст = НачОст(Сумма);
|Функция СуммаПриход = Приход(Сумма);
|Функция СуммаРасход = Расход(Сумма);
|Функция СуммаКонОст = КонОст(Сумма);
|Группировка ТекущийДокумент;
|Условие(Номенклатура = СписокЗначенийЗапроса[1]);
|";

Если Запрос77.Выполнить(ТекстЗапроса) = 0 Тогда
 Возврат;
КонецЕсли;
   ДенисЧ
 
2 - 16.11.18 - 10:26
Именно запрос или вся обработка?
   plnz
 
3 - 16.11.18 - 10:27
именно запрос
   plnz
 
4 - 16.11.18 - 10:30
было два варианта формирования условия запроса 
1) через номенклатура.код = штрихкод
2) использовать решение с помощью известной процедуры СкорректироватьСписок

так вот по времени - если в 7.7 (напрямую) в звпросе написать условие номенклатура.код = штрихкод вместо номенклатура = ВыбНоменклатур, то время выполнение соизмеримо с временем по ОЛЕ
   plnz
 
5 - 16.11.18 - 10:30
надеюсь понятно выразился...
   NikVars
 
6 - 16.11.18 - 10:31
Семерочная Оле не быстрая штука.
   Ёпрст
 
7 - 16.11.18 - 10:33
(4) ясен пень, за условия через точку нужно пизд..ть линейкой по пальчикам, чтоб неповадно было
   Ёпрст
 
8 - 16.11.18 - 10:35
напиши так:

|ШК = Регистр.ОстаткиИзделий.Изделие.Код;
|Условие (ШК = ШтрихКод);

   plnz
 
9 - 16.11.18 - 10:35
(7) я и привел это для сравнения
такое чувство, что пол оле условие запроса как-то по другому обрабатывается. такое возможно?
   Ёпрст
 
10 - 16.11.18 - 10:35
наслаждайся
 
 Рекламное место пустует
   Ёпрст
 
11 - 16.11.18 - 10:35
(9) нет
   plnz
 
12 - 16.11.18 - 10:35
(8) пробовал. не помогает
   Ёпрст
 
13 - 16.11.18 - 10:35
база 7.7 вообще не догадывается, что её кто-то по оле запустил, ей пофик
   Ёпрст
 
14 - 16.11.18 - 10:36
(12) врешь же.
   plnz
 
15 - 16.11.18 - 10:37
(14) нет, ча с замерами скину картинку
   ptiz
 
16 - 16.11.18 - 10:37
(0) ОЛЕ в 7.7 - тормоз, это нормально. Если надо быстро - запускать 7.7 через командную строку с параметрами, чтобы она вернула ответ в текстовый файл, например.
   plnz
 
17 - 16.11.18 - 10:44
это замер в 8
https://yadi.sk/i/ZaF0SCBhE-e3Qw
   plnz
 
18 - 16.11.18 - 10:49
   plnz
 
19 - 16.11.18 - 10:54
и замер в 7.7 с сылкой на справочник (и без строчки в запросе

ШК = Регистр.ОстаткиИзделий.Изделие.Код;

https://yadi.sk/i/wgENU1dxBSMwiw
   Ёпрст
 
20 - 16.11.18 - 11:00
(19) ты сравниваешь несравнимые вещи.

Ты сравни время выполнения (8) и такой код:

|Изделие = Регистр.ОстаткиИзделий.Изделие;
|Условие (Изделие.Код = ШтрихКод);

   Ёпрст
 
21 - 16.11.18 - 11:01
Если надо скорости - пиши прямой запрос к базе 7.7 из снеговика
   Ёпрст
 
22 - 16.11.18 - 11:01
7.7 у тя дбф ? sql ?
   plnz
 
23 - 16.11.18 - 11:02
(22) дбф
   plnz
 
24 - 16.11.18 - 11:05
(20) то есть добиться нормальной скорости не получится без ухищрений?
   plnz
 
25 - 16.11.18 - 11:05
либо прямой запрос, либо то-то еще?
   АгентБезопаснойНацио
 
26 - 16.11.18 - 11:06
(25) (24) а разве прямой запрос - ухищрение? по моему, это как раз нормальный язык.
   plnz
 
27 - 16.11.18 - 11:07
(26) я с ними не сталкивался... поэтому пока для меня это ухищрение ))
   Ёпрст
 
28 - 16.11.18 - 11:10
(23) На вот, как образец..



    КаталогИБ = "D:\Base\"; // тут свой путь воткнешь + в системе должен быть установлен vfp провайдер, вот отсюда, к примеру:
    //  http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
    ОлеДБ = Новый COMОбъект("ADODB.Connection");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
    ОлеДБ.Open(Соединение);
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = ОлеДБ;
    ТекстЗапроса = "
        |select *
        |  Спр.descr as Номенклатура,
        |  Спр.sp85 as Артикул,
        |  sum(Рег.sp411) as Остаток
        |from rg405 as Рег
        |   left join sc84 as Спр on Спр.id = Рег.sp408
        |where Рег.period= {d '2018-11-01'}
        |group by Спр.descr,Спр.sp85
        |order by Спр.descr
        |";
    Command.CommandText = ТекстЗапроса;    
    RecordSet = Command.Execute();
    Если not RecordSet.EOF() Тогда
        RecordSet.MoveFirst();
        Пока НЕ RecordSet.EOF() Цикл
            Сообщить(RecordSet.Fields.Item("Номенклатура").Value + " "+RecordSet.Fields.Item("Артикул").Value+" "+RecordSet.Fields.Item("Остаток").Value);
            RecordSet.MoveNext();  
        КонецЦикла;
    КонецЕсли;
    RecordSet.Close();

   plnz
 
29 - 16.11.18 - 11:10
(28) Спасибо
   Ёпрст
 
30 - 16.11.18 - 11:11
(24) только если скармливать будешь чорному запросу нормальные параметры в виде ссылок. Через оле это получится, если будешь передавать массив в текст запроса, элементом которого является список значений, в списке - элементы для фильтра
   Ёпрст
 
31 - 16.11.18 - 11:12
сам массив должен быть глобальным
   azernot
 
32 - 16.11.18 - 11:15
(0) Причина в том как этот запрос выполняется. По сути он таскает данные туда-сюда между 7.7 и 8.0

Если есть желание не использовать прямые запросы, ВК и т.п., а обойтись штатными средствами, рекомендую использовать что-то вроде такой конструкции:

в 1С 7.7 в глобальном модуле
//*****************************************************************************

Функция ВыполнитьЗапросПоCOM(ТекстЗапроса, Флаг = 0, Итоги = 1) Экспорт
    
    Запрос = CreateObject("Запрос");
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    
    Попытка
        Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
            Если Запрос.Выгрузить(ТЗ, Флаг, Итоги) = 1 Тогда
                Возврат ТЗ;
            Иначе
            Возврат "Не удалось выгрузить результаты запроса!";
            КонецЕсли;
        Иначе
            Возврат "Не удалось выполнить запрос!";
        КонецЕсли; 
    Исключение
        Возврат ОписаниеОшибки();
    КонецПопытки;
КонецФункции



А в 1С 8 

ТЗ_Запроса77 = v77_com.EvalExpr("ВыполнитьЗапросПоCOM("+""""+СтрЗаменить(ТекстЗапроса, Символы.ПС, "")+""""+", 0, 0)");


И разбирать ТЗ на стороне 1С 8 (с учётом того, что это OLE-объект)
   plnz
 
33 - 16.11.18 - 11:18
(32) такая идея тоже была...
 
 


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует