Имя: Пароль:
1C
1С v8
Закрытие COM-соединения 1С 8.2
0 IdoL2k
 
20.12.11
11:59
1. Подключаюсь к ИБ через com-соединение.
*В диспетчере задач появляется новый процесс 1cv8.exe*
2. Получаю данные запросом, выгружаю в таблицу значений. Обрабатываю полученные данные.
3. Присваиваю коннектору и связаным переменным значение Неопределено.
*В диспетчере задач продолжает висеть созданный процесс 1cv8.exe*
4. Закрываю обработку, вызывающую com-соединение
*В диспетчере задач продолжает висеть созданный процесс 1cv8.exe*
5. Закрываю сеанс 1С:Предприятие, из которого вызывалась обработка
*В диспетчере задач продолжает висеть созданный процесс 1cv8.exe*

Итого: если я запускаю обработку несколько раз, то незавершенные процессы множатся. После закрытия программы ключ защиты не освобождается. Память забивается. Пользователи нервничают. Паника.

Метод Disconnect для V82.Application не работает.

Как заставить процессы закрываться после завершения соединения??

Исходный код:

ПараметрСоединения = "File=""E:\1CBase\8.2\DemoAccounting20"";Usr=""Любимов (администратор)"";Pwd="""";";
   Бух =  Новый COMобъект("V82.Application");
   Попытка
       Бух.Connect(ПараметрСоединения);
   Исключение
       Сообщить("Ошибка при подключении к бухгалтерии!
               |"+ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   // видимо переменная попадает в кеш
   врФлагЗавершения = Бух.глЗначениеПеременной("глЗапрашиватьПодтверждениеПриЗакрытии");
   // тут мы её меняем
   Бух.глЗначениеПеременнойУстановить("глЗапрашиватьПодтверждениеПриЗакрытии", Ложь);
   // а это опять обновляет её в кеше
   врФлагЗавершения = Бух.глЗначениеПеременной("глЗапрашиватьПодтверждениеПриЗакрытии");
   
   Запрос = Бух.NewObject("Запрос");
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
   |    ХозрасчетныйОстатки.Субконто3 КАК Склад,
   |    ХозрасчетныйОстатки.КоличествоОстаток КАК Остаток
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладах), , ) КАК ХозрасчетныйОстатки";
   Запрос.УстановитьПараметр("Период",ТекущаяДата());
   тзОстатки = Запрос.Выполнить().Выгрузить();
   
   Отчет.ОстаткиТоваров.Очистить();
   Для Каждого СтрОстаток ИЗ тзОстатки Цикл
       НоваяСтрока = Отчет.ОстаткиТоваров.Добавить();
       НоваяСтрока.Номенклатура = СтрОстаток.Номенклатура.НаименованиеПолное;
       НоваяСтрока.Склад = СтрОстаток.Склад.Наименование;
       НоваяСтрока.Остаток = СтрОстаток.Остаток;
   КонецЦикла;
   
   врФлагЗавершения = Неопределено;
   Запрос = Неопределено;
   тзОстатки = Неопределено;
   Бух = Неопределено;
1 Ненавижу 1С
 
гуру
20.12.11
12:00
а если COMConnector?
2 alexandrius
 
20.12.11
12:08
А метода Exit тама нету случаем?
3 Jolly Roger
 
20.12.11
12:08
(0) телепатирую: оно просит подтвердить закрытие приложения...
4 Jolly Roger
 
20.12.11
12:10
+(3) а не... плохой из меня телепат...
5 IdoL2k
 
20.12.11
12:26
Ааа.. туплю.. Когда копировал кусок кода, не заметил, что там Application. Сейчас попробую через COMConnector
6 IdoL2k
 
20.12.11
12:45
О. Через ком-коннектор все отлично.
7 Михаил Козлов
 
20.12.11
12:49
Должно и Application закрываться (постоянно пользуюсь (есть на то причины) - все ОК. Через небольшое время после соединение = НЕОПРЕДЕЛЕНО процесс умирает. Правда база скульная).
8 Hawk_1c
 
20.12.11
12:51
Application Может висит предупреждение? "Закрывать базу или нет". в настройках пользователя поставить, не спрашивать...
9 YF
 
20.12.11
12:53
(7, 8)  у меня тоже не закрывается через application, даже при отсутствии вопросов о подтверждении: v8: сом-объект. Невидимость + закрытие
10 Hawk_1c
 
20.12.11
12:54
Ну я так понимаю теории начались. Автору COMConnector помог. Я тоже к примеру юзаю COMConnector.
11 эцп
 
20.12.11
12:56
(0) Лучше всего вынести этот код в отдельную процедуру, чтобы все использованные переменные были локальными. В таком случае ничему "Неопределено" присваивать не придется и гарантировано завершение COM-процесса.
12 8vC1
 
20.12.11
12:57
Бух.Close();