Имя: Пароль:
1C
 
1C 8 + Ole 7.7
,
0 plnz
 
16.11.18
10:25
Из восьмерки (обычные формы) по ОЛЕ подключаюсь к 7.7 и выполняю там запрос. Запрос выполняется очень долго (минут 10). Тот же самый запрос напрямую в 7.7 выполняется за доли секунды. В чем может быть причина?
1 plnz
 
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
Именно запрос или вся обработка?
3 plnz
 
16.11.18
10:27
именно запрос
4 plnz
 
16.11.18
10:30
было два варианта формирования условия запроса
1) через номенклатура.код = штрихкод
2) использовать решение с помощью известной процедуры СкорректироватьСписок

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


|ШК = Регистр.ОстаткиИзделий.Изделие.Код;
|Условие (ШК = ШтрихКод);
9 plnz
 
16.11.18
10:35
(7) я и привел это для сравнения
такое чувство, что пол оле условие запроса как-то по другому обрабатывается. такое возможно?
10 Ёпрст
 
16.11.18
10:35
наслаждайся
11 Ёпрст
 
16.11.18
10:35
(9) нет
12 plnz
 
16.11.18
10:35
(8) пробовал. не помогает
13 Ёпрст
 
16.11.18
10:35
база 7.7 вообще не догадывается, что её кто-то по оле запустил, ей пофик
14 Ёпрст
 
16.11.18
10:36
(12) врешь же.
15 plnz
 
16.11.18
10:37
(14) нет, ча с замерами скину картинку
16 ptiz
 
16.11.18
10:37
(0) ОЛЕ в 7.7 - тормоз, это нормально. Если надо быстро - запускать 7.7 через командную строку с параметрами, чтобы она вернула ответ в текстовый файл, например.
17 plnz
 
16.11.18
10:44
это замер в 8
https://yadi.sk/i/ZaF0SCBhE-e3Qw
18 plnz
 
16.11.18
10:49
19 plnz
 
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 ?
23 plnz
 
16.11.18
11:02
(22) дбф
24 plnz
 
16.11.18
11:05
(20) то есть добиться нормальной скорости не получится без ухищрений?
25 plnz
 
16.11.18
11:05
либо прямой запрос, либо то-то еще?
26 АгентБезопасной Нацио
 
16.11.18
11:06
(25) (24) а разве прямой запрос - ухищрение? по моему, это как раз нормальный язык.
27 plnz
 
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();
29 plnz
 
16.11.18
11:10
(28) Спасибо
30 Ёпрст
 
16.11.18
11:11
(24) только если скармливать будешь чорному запросу нормальные параметры в виде ссылок. Через оле это получится, если будешь передавать массив в текст запроса, элементом которого является список значений, в списке - элементы для фильтра
31 Ёпрст
 
16.11.18
11:12
сам массив должен быть глобальным
32 azernot
 
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-объект)
33 plnz
 
16.11.18
11:18
(32) такая идея тоже была...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн