Имя: Пароль:
1C
1С v8
V83.ComConnector vs V83.Application
0 Jenstel
 
26.05.14
12:29
Доброго времени суток. Подскажите, почему при соединении с базой 1С с помощью 'V83.ComConnector' любые операции выполняются значительно дольше, чем при подключении с помощью 'V83.Application', например даже одна строка
Con1C.Документы.ПлатежноеПоручение.СоздатьДокумент();
выполняется 5-6 секунд, но если подключение через 'V83.Application', то она выполняется практически моментально.
1 Cube
 
26.05.14
12:37
(0) Че ты заливаешь? Коннектор на порядок (в 10 раз) быстрее работает...
2 shuhard
 
26.05.14
12:49
(0) брехня
3 Jenstel
 
26.05.14
12:51
(1) я в курсе, поэтому и сбит с толку
вот полный код, висит на событии нажатия кнопки
PP := Con1C.Документы.ПлатежноеПоручение.СоздатьДокумент();
PP.Дата := DateTimeToStr(Now);
PP.ПеречислениеВБюджет := true;
PP.КодБК := Duty.КодБК;
PP.ВидПеречисленияВБюджет := Duty;
PP.Контрагент := Customer;
PP.Заполнить(Duty);
PP.СчетОрганизации := Account;
PP.Ответственный := User;
PP.СуммаДокумента := '100.00';
PP.НазначениеПлатежа := Destination;
PP.Записать;
Соединение создаю
Com:=CreateOleObject('V83.ComConnector') as IV8ComConnector;
Con1C:= Com.Connect ('File="ХХХ";usr=ХХХ;pwd=ХХХ');

Подскажите, в чем может быть проблема. После нажатия на кнопку приложение "подвисает" на 5-6 секунд (кнопка в нажатом состоянии), но стоит соединиться как V83.Application  и это все происходит моментально.
4 acsent
 
26.05.14
12:56
может ключ ищет долго?
5 Jenstel
 
26.05.14
13:12
(4) Как ускорить?
6 Jenstel
 
26.05.14
13:38
Сделал лог с временем каждой операции. Дольше всех выполняются:
PP.Заполнить(Duty); ~ 2 секунды
PP.Записать; ~ 4 секунды
7 Cube
 
26.05.14
13:40
(6) Может в платформе дело? Какой релиз? поставь другой.
8 Jenstel
 
26.05.14
13:47
Еще есть разница в запуске: из компилятора Delphi тайминги как написал выше, а если запускать уже скомпилированный exe - выполнение занимает 1,5-2 секунды.
С 'V83.Application' - вся операция занимает 57 миллисекунд

Платформа - 8.3.4.482
9 Cube
 
26.05.14
13:49
(8) Попробуй 8.3.5.
10 Jenstel
 
26.05.14
14:26
(9) Изменений нет
Может я не так коннектор создаю?
11 DmitrO
 
26.05.14
15:03
А exe компилируешь 32-битный?
12 Jenstel
 
26.05.14
15:23
(11) Да хоть какой.
Я первым подумал на разрядность и возможные косяки. Для чистоты эксперимента перенес исходник на виртуальную машину c WinXP и попробовал скомпилировать и запустить там. Все идентично.
Куда копать, ума не приложу.
13 DmitrO
 
26.05.14
15:31
Ну ты не ответил на вопрос-то..
Приведенное время по ComConnector на какой разрядности приложения?
И что значит на "хоть какой", если собрать exe 64-битный тоже работает?
14 alex007ag
 
26.05.14
15:33
вот так надо,
http://www.forum.mista.ru/confirm.php?id=97474&pass=067c29828a17a6587d0a49c51f746a04

как на 17 секунде
15 DmitrO
 
26.05.14
15:33
Есть подозрения, что компилятор Delphi слишком умный..
16 alex007ag
 
26.05.14
15:33
17 Jenstel
 
26.05.14
15:33
Exe собирал только 32-битный. Все описания только к 32-битной версии.
18 alex007ag
 
26.05.14
15:37
(15) Как его притупить немного? :)
Я импортировал библиотеку V83_TLB, может не стоило этого делать?
19 alex007ag
 
26.05.14
15:42
(18)эта библиотека позволит применить ранее связывание, но только для самого коннектора, а не для полученного им соединения, там полюбому будет позднее.. так что это не повлияет никак.
Я не знаю особенностей компилятора, может он зачем-то маршалит вызовы собственными силами, хотя именно комконнектору это не нужно, т.к. это InProc COM сервер.
Хотя даже в этом случае что-то велика разница..
20 oleg_km
 
26.05.14
15:43
(18) Импорт tlb наоборот должен только ускорить
21 Jenstel
 
26.05.14
15:47
(19) (20) что же делать тогда?
Поделитесь Вашим кодом вызова СОМ-соединителя
22 DmitrO
 
26.05.14
15:51
сто лет в Delphi не пишу уже.. только с++

думать, читать, думаю пользователю не так критично 5-6 секунд, пусть пока так работают..

надо дождаться тех кот на Delphi пишут, здесь такие есть..
23 Jenstel
 
26.05.14
15:56
(22) Я выделил только самую малую часть кода, которая доолжна выполняться. Полный код более 200 строк, да еще и циклы (синхронизация справочником между базой рабочей программы и 1С, создание документов, создание документов на их основе). Полная процедура с созданием 5 документов длиться 27 секунд, тогда как 'V83.Application' делает это за 4.
24 DmitrO
 
26.05.14
16:00
Или попробуй переписать через чистый IDispatch, без понтов делфёвого компилятора:

вместо:
PP.Записать

применять:
IDispatch::GetIDsOfNames()
IDispatch::Invoke()
25 DmitrO
 
26.05.14
16:02
хотя врядли поможет.. тут чета другое
26 oleg_km
 
26.05.14
16:08
Может для Connector другой РЛС работает?
27 DmitrO
 
26.05.14
16:11
(26)Кстати да, неплохая мысль, пользователь 1С тот-же для коннектора используется?
28 Jenstel
 
26.05.14
16:13
(27) Для коннектора создал нового юзера (пока с полными правами, база тестовая)
Но пробовал и под своим рабочим логином - результат тот же
29 Jenstel
 
26.05.14
16:17
А есть возможность сначала собрать текст скрипта, а потом выполнить его целиком в 1С (аналогично SQL execute), а не выполнять построчно каждое действие.
30 Jenstel
 
26.05.14
19:22
(29) ап
31 Defender aka LINN
 
26.05.14
19:44
(29) Выполнить(), как ни ВНЕЗАПНО
32 Jenstel
 
26.05.14
20:02
(31) ВНЕЗАПНО не пашет, не поддерживает метод
33 Jenstel
 
26.05.14
21:18
ап
знающие люди, помогите плиз
34 DmitrO
 
26.05.14
21:33
Нет такой возможности. Выполнить() работать не будет.