![]() |
![]() |
![]() |
|
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
|
(37) Типа? http://1cnk.ru/Articles/V8OLE.html
|
|||
40
necro
04.10.13
✎
09:54
|
(39) читал, там к сожалению ничего такого нет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |