Имя: Пароль:
1C
1C 7.7
v7: Падает 1с77 при использовании 1с8 через OLE и COM
0 necro
 
02.10.13
05:36
В глобальном модуле две переменных: ком-соединение и оле-соединение, создаются в ПриНачалеРаботыСистемы(), обнуляются в ПриЗавершенииРаботыСистемы(); доступ к ним организован через функции СоздатьСоединение(), которые возвращают существующее соединение, либо создают новое, если его нет. 1с77 падает при завершении работы системы (уже после того, как закрылось окно программы); если ОЛЕ соединение инициализировать непосредственно перед использованием а потом сразу обнулять, падает значительно реже (но и работает соответственно дольше), однако всё равно иногда падает.
У кого-нибудь есть предположения, как это побороть?
1 necro
 
03.10.13
12:36
Неужели никто не запускал восьмерку из семерки?
2 Кирпич
 
03.10.13
12:43
ну неизвестно, что ты там понапрограммировал. может там ересь какая.
3 necro
 
03.10.13
12:45
на скриптовом языке сложно что-нибудь эдакое напрограммировать, чтобы программа падала, я даже не знаю, как мне это удалось
4 Кирпич
 
03.10.13
12:47
наверное ссылок наплодил. восьмерка закрылась, а ссылки в семерке остались. ну это так. предположение.
5 necro
 
03.10.13
12:49
так ПриНачалеРаботыСистемы():
cntr = СоздатьОбъект(ТипСоединения);//"V82.Application"
Соединение = cntr.Connect(давКарты_СтрокаПодключения);

так каждый раз перед вызовом какого-то метода:
Если (Соединение = 0) Тогда
cntr = СоздатьОбъект(ТипСоединения);//"V82.Application"
Соединение = cntr.Connect(давКарты_СтрокаПодключения);        
        КонецЕсли;

так ПриЗавершенииРаботыСистемы():
Соединение = 0;

если последнее не сделать, то если было ОЛЕ соединение, то после исчезновения окна 1С появляется сообщение об ошибке, если делать - то то же самое, но не каждый раз
6 Кирпич
 
03.10.13
12:52
(5) и всё чтоли? больше ничо не делаешь?
7 necro
 
03.10.13
12:56
ну как же, процедурки разнообразные из модуля внешнего соединения восьмерочной базы вызываю, передаю туда исключительно строки, на том конце выполняются несложные запросы к справочникам (вроде найтипокоду) и проводится простейший документ. там и кода-то особого нет.
8 Кирпич
 
03.10.13
12:56
а cntr=0 пробовал?
9 necro
 
03.10.13
12:57
не, не пробовал
10 Кирпич
 
03.10.13
12:57
а после каждого
Соединение = cntr.Connect(давКарты_СтрокаПодключения);        
делать Соединение = 0 пробовал?
11 necro
 
03.10.13
12:57
попробую
12 necro
 
03.10.13
12:59
(10) так получится на каждый вызов новое соединение, это слишком долго, поэтому хранится глобальная переменная с соединением
13 Кирпич
 
03.10.13
12:59
если Соединение у тебя одно и создается один раз, то в
ПриЗавершенииРаботыСистемы():

попробуй так
Соединение = 0;
cntr=0;
14 Кирпич
 
03.10.13
13:00
(12) понял
15 Кирпич
 
03.10.13
13:01
ну и остальное показал бы. мож где ссылки остаются еще.
16 necro
 
03.10.13
13:02
(13) cntr вообще локальная переменная в той функции, которая создает соединение, она по идее должна всё-таки успеть обнулиться до выхода из программы
17 Кирпич
 
03.10.13
13:04
(16) ну ты ее глобальной сделай. для интересу
18 necro
 
03.10.13
13:10
(16) но я так понимаю от неё наоборот нуцжно как можно быстрее избавиться, вся работа идет через Соединение же а не через cntr
19 necro
 
03.10.13
13:11
вот сейчас никак не могу воспроизвести ошибку - не падает. наверное от фазы луны зависит.
20 Кирпич
 
03.10.13
13:14
(18) ну если ты в документации проичтал, что от этой переменной надо быстрее избавиться, то это - да, понимание. а так, это не понимание, это фантазии.
21 Кирпич
 
03.10.13
13:16
"наверное от фазы луны зависит"
а фазы луны - это обычно операторы ветвления в наших программах :)
22 necro
 
03.10.13
13:22
(20) в документации я ничего про порядок удаления переменных не видел, наверное потому, что подразумевается что в скриптовых языках ничего удалять не надо.
А фантазия подсказывает, что раз переменная cntr больше не для чего не нужна, то она не нужна. Соответственно в отличие от самого соединения она локальная в функции и по идее при выходе из функции должна удалиться сама, не сохранять же мне её про запас.
23 Кирпич
 
03.10.13
13:26
я чота вообще не понимаю как у тебя Соединение получается
посмотрел в хелпе
// Пример приводится на языке MS Visual Basic:
Dim connector As Object
Set connector=CreateObject("V82.Application")
result=connector.Connect("File=c:\InfoBases\Trade;Usr=Director;")
24 necro
 
03.10.13
13:26
(23) result это и есть Соединение
25 Кирпич
 
03.10.13
13:26
Возвращаемое значение:

Тип: Булево.
Истина - инициализация прошла удачно, Ложь - в противном случае.
26 Кирпич
 
03.10.13
13:27
и чо работает?
27 necro
 
03.10.13
13:28
а, так это если Application - то булево, а если V82.ComConnector, то в ответе как раз соединение
28 Кирпич
 
03.10.13
13:29
(27)а у тебя что?
29 necro
 
03.10.13
13:30
у меня оба. но Application я в результате стал создавать непосредственно перед использованием и сразу после этого обнулять, и вообще он подозрительный какой-то
30 necro
 
03.10.13
13:31
так что сейчас постоянно подключено "Внешнее соединение"
31 necro
 
03.10.13
13:32
кстати вот пример:

// Создание объекта-коннектора
cntr = Новый COMObject("V83.COMConnector");
// создается объект COM-соединение
connection = cntr.Connect("File=""c:\InfoBases\Trade"";Usr=""Director"";");
СпрКонтрагенты = connection.Справочники.Контрагенты;
Выборка = СпрКонтрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;
32 necro
 
03.10.13
13:33
никакие объекты из ИБ 1С8 не возвращаются и в неё не передаются, так что на них ссылок нет
33 Кирпич
 
03.10.13
13:39
(32) ну у тебя в примере (31) уже две ссылки (СпрКонтрагенты и Выборка)

вобщем cntr делай глобальной и убивай при закрытии.
т.к. больше кода нету, то и гадать больше нечего.
34 necro
 
03.10.13
13:42
(33) да это не мой пример а из синтакс-помощника, я создание соединения оттуда скопипастил.
35 Кирпич
 
03.10.13
13:45
(34) ну и хорошо
36 necro
 
04.10.13
09:33
кхм. запустил это безобразие у клиента, там две семерочные торговли к моей восьмерке коннектятся. Обе (ОБЕ!) упали с первого же вызова функции из модуля внешнего соединения (передаем в восьмерку строку и получаем в ответ Соответствие, у которого все элементы - строки). После перезапуска одна нормально заработала, вторая не запускалась вообще еще полчаса. Отладчик вывел в ПриОткрытии() обработки FR_COMM. Фискального регистратора на рабочем месте нет. Отключил его в настройках. В процессе пока пытался запустить базу которая не запускалась, тестировал ту, которая запускалась. При мне работало. Кроме того, платформа запускалась 25-го релиза, исправил на 27. Не знаю, есть ли во всем этом взаимосвязь, ведь и у меня на компьютере падало, но у меня всё же в основном при использовании V82.Application, а там я оставил только V82.COMConnector.
37 necro
 
04.10.13
09:35
Есть вообще где-нибудь что-нибудь про практическое использование COM 1с8 из 1с77?
38 Кирпич
 
04.10.13
09:46
пока не покажешь код тебе никто ничем не поможет
39 Бертыш
 
04.10.13
09:49
40 necro
 
04.10.13
09:54
(39) читал, там к сожалению ничего такого нет