Имя: Пароль:
1C
 
Подключение к базе 1С 7.7 Com-соединение
,
0 ice123
 
08.12.09
16:54
Народ, помогите с проблемкой, которая заключается в следующем:
есть подключение к базе 7.7 через Com-соединение.
Почему-то стало подвисать соединение с 7-кой, даже если пройдена процедура закрытия 7-ки:
Процедура ЗакрытьВ7(в7, параметры) Экспорт
   
   Если Не в7 = Неопределено Тогда
       Попытка
           в7.ЗавершитьРаботуСистемы(0);                        
       Исключение
           Сообщить("/d" + Путь + "/n" +  СокрЛП(Логин) + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
       КонецПопытки;
   КонецЕсли;    
   
   Состояние("Основная база закрыта");
   
   в7 = Неопределено;    
   
КонецПроцедуры


В чем может быть проблема???
1 ДенисЧ
 
08.12.09
16:56
Не все созданные объекты занулены...
2 ice123
 
08.12.09
16:56
Дык ведь самому Com-соединению присваиваю в конце B7 =Неопределено
3 ДенисЧ
 
08.12.09
16:58
(2) А остальные-то висят...
4 ice123
 
08.12.09
16:58
Да, кстати, если свернуть все окна, то под окнами окажется окошко 7-ки, с вопросом "Завершить ли работу системы Да/Нет"...
(3)что остальное может висеть?
5 ДенисЧ
 
08.12.09
17:00
ну блин...
Глобальник ПриЗавершенииРаботыСистемы() ковыряй на предмет вопроса...
А висеть может любой объект, созданный через в7.CreateObject() и т.п.
6 ice123
 
08.12.09
17:00
(5) где ковырять в 7-ке или в 8-ке?
7 ДенисЧ
 
08.12.09
17:01
(6) чей вопрос висит?
Продолжать7
8 ice123
 
08.12.09
17:02
(7) Спасибо! будем искать, но туплю чего-то я нешуточно...))
9 ice123
 
08.12.09
17:11
И все же...что написать бы такое, чтобы закрылись все созданные через Com-соединения объекты?
10 ДенисЧ
 
08.12.09
17:14
(9) Сразу, как созданный объект не нужен - обнуляй его...
11 ice123
 
08.12.09
17:16
(9)понятно... Попробую, спасибо!
12 ice123
 
09.12.09
17:41
Мучает меня все та же проблема. Подвисает соединение 7-ки, отслеживаю в диспетчере задач.
что не так?
13 ice123
 
09.12.09
17:42
Код подсоединения к 7-ке:
Параметры = новый Структура;    
   Параметры.Вставить("ПараметрыБД", ?(пустаяСтрока(пароль),"/d" + Путь + " /n" + СокрЛП(Логин),
   "/d" + Путь + " /n" + СокрЛП(Логин) + " /p" + сокрЛП(пароль)));
   
   Попытка
       в7 = Новый COMОбъект("V1CEnterprise.Application");
       _открыта = в7.initialize(в7.RMTrade, СокрЛП(Параметры.ПараметрыБД), "NO_SPLASH_SHOW");                        
   Исключение        
       Состояние("/d" + Путь + "/n" +  СокрЛП(Логин)   + ОписаниеОшибки());    
       Возврат Ложь;
   КонецПопытки;
   
   ОткрытаБД = Новый Структура;
   ОткрытаБД.Вставить("_открыта", _открыта);
   ОткрытаБД.Вставить("в7", в7);    
   ОткрытаБД.Вставить("Параметры", Параметры);    
   
   Возврат ОткрытаБД;
14 ice123
 
09.12.09
17:42
Код закрытие 7-ки:
Если Не в7 = Неопределено Тогда
       Попытка                
           в7.ЗавершитьРаботуСистемы(0);                        
       Исключение
           Сообщить("/d" + Путь + "/n" +  СокрЛП(Логин) + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
       КонецПопытки;
   КонецЕсли;    
   
   Состояние("Основная база закрыта");    
   
   в7 = 0;
15 ice123
 
09.12.09
17:43
Код извлечения данных из 7-ки в 8-ку:
Попытка
       ТЗСравнения77 = Новый ТаблицаЗначений;              
       ТЗСравнения77.Колонки.Добавить("КодФирмы");
       //ТЗСравнения77.Колонки.Добавить("ИНН");
       ТЗСравнения77.Колонки.Добавить("НомерДокумента");
       ТЗСравнения77.Колонки.Добавить("ПредставлениеНомДок");
       ТЗСравнения77.Колонки.Добавить("ВидДокумента");        
       ТЗСравнения77.Колонки.Добавить("ПредставлениеВидаДокумента");
       ТЗСравнения77.Колонки.Добавить("Вид");        
       ТЗСравнения77.Колонки.Добавить("ДатаДокумента");        
       ТЗСравнения77.Колонки.Добавить("Организация");                      
       ТЗСравнения77.Колонки.Добавить("Сумма");        
       ТЗСравнения77.Колонки.Добавить("Контрагент");
       ТЗСравнения77.Колонки.Добавить("ДокОснНомер");                
       ТЗСравнения77.Колонки.Добавить("ДокОснВид");                
       ТЗСравнения77.Колонки.Добавить("ДокСчет");
       ТЗСравнения77.Колонки.Добавить("Счет");                            
       
       V7Фирма = в7.CreateObject("Справочник.НашиФирмы");
       Если НЕ (Организация = Справочники.Организации.ПустаяСсылка()) Тогда                        
           Если V7Фирма.НайтиПоКоду(СокрЛП(Организация.Код)) = 1 Тогда
               V7Фирма = V7Фирма.ТекущийЭлемент();
               ИНН = СокрЛП(V7Фирма.ИНН.Получить(ТекущаяДата()));
               Если ИНН = СокрЛП(Организация.ИНН) Тогда
                   V7Организация = V7Фирма;            
               КонецЕсли;
           КонецЕсли;            
       Иначе                                                                            
           V7Организация = в7.CreateObject("СписокЗначений");                            
           V7Фирма.ВыбратьЭлементы();
           Пока V7Фирма.ПолучитьЭлемент() > 0 Цикл
               Если ПустаяСтрока(V7Фирма.Префикс) = 0 Тогда
                   V7Организация.ДобавитьЗначение(V7Фирма.ТекущийЭлемент());  
               КонецЕсли;
           КонецЦикла;            
       КонецЕсли;    
       
       V7Фирма = 0;
       
       Для каждого ЭлементСпсЗнач Из Счет77 Цикл        
           V7Счет  = в7.CreateObject("Счет");                    
           V7Счет.НайтиПоКоду(ЭлементСпсЗнач.Значение);
           
           V7БИ = в7.CreateObject("БухгалтерскиеИтоги");
           V7БИ.ИспользоватьСубконто(V7Счет.ВидСубконто(1), V7Организация);  
           V7БИ.ИспользоватьСубконто(V7Счет.ВидСубконто(2));
           Если ЭлементСпсЗнач.Значение = "РКН" Тогда
               V7БИ.ИспользоватьСубконто(V7Счет.ВидСубконто(3));
           КонецЕсли;
           
           V7БИ.ВыполнитьЗапрос(НачДата, КонецДня(КонДата), ЭлементСпсЗнач.Значение, "", "", 3, "Проводка", "С");                
           
           V7БИ.ВыбратьСчета();
           Пока V7БИ.ПолучитьСчет() = 1 Цикл
               СчКод = V7БИ.Счет.Код;
               
               V7БИ.ВыбратьСубконто(1);
               Пока V7БИ.ПолучитьСубконто(1) = 1 Цикл                                                  
                   Код                     = СокрЛП(V7БИ.Субконто(1).Код);
                   НаименованиеОрганизации = V7БИ.Субконто(1).Наименование;                    
                   
                   V7БИ.ВыбратьПериоды();
                   Пока V7БИ.ПолучитьПериод() = 1 Цикл  
                       V7Операция = V7БИ.Операция;    
                       Документ = V7Операция.Документ;
                       ДокВид = Документ.Вид();
                       ДокПредставлениеВида = Документ.ПредставлениеВида();
                       ДокНомер = Документ.НомерДок;
                       ДокДата = Документ.ДатаДок;
                       ДокОснНомер = ?(ДокВид = "КурсовыеРазницы", СокрЛП(Документ.ДокументОснование.НомерДок), "");
                       ДокОснВид = ?(ДокВид = "КурсовыеРазницы", Документ.ДокументОснование.Вид(), "");
                       
                       Состояние("Получение данных из основной базы, документ: " + ДокПредставлениеВида + " № " + СокрЛП(ДокНомер) + " от " +  Формат(ДокДата, "ДФ=dd.MM.yyyy"));                                
                       
                       V7БИ.ВыбратьСубконто(2);
                       Пока V7БИ.ПолучитьСубконто(2) = 1 Цикл
                           //ИНН = СокрЛП(V7БИ.Субконто(2).ИНН);
                           Контрагент = СокрЛП(V7БИ.Субконто(2).Код);
                           
                           НоваяСтрока = ТЗСравнения77.Добавить();                        
                           НоваяСтрока.ВидДокумента      = ДокВид;
                           НоваяСтрока.ПредставлениеВидаДокумента = ДокПредставлениеВида;
                           НоваяСтрока.ДатаДокумента = ДокДата;    
                           НоваяСтрока.КодФирмы     = Код;
                           //НоваяСтрока.ИНН          = ИНН;
                           НоваяСтрока.Организация  = НРег(НаименованиеОрганизации);                            
                           НоваяСтрока.ДокОснНомер  = ДокОснНомер;
                           НоваяСтрока.ДокОснВид    = ДокОснВид;
                           НоваяСтрока.Счет         = СчКод;
                           НоваяСтрока.ПредставлениеНомДок = СокрЛП(ДокНомер);                    
                           
                           Если ДокВид = "ПоступлениеТМЦ" Тогда
                               НоваяСтрока.Вид = Документ.ПолучитьАтрибут("Вид");
                               Если НоваяСтрока.Вид = 1 Тогда        
                                   НоваяСтрока.НомерДокумента = "ОБ-" + РегламентированнаяОтчетность.ДополнитьСтроку(СокрЛП(ДокНомер), 8, "0", 0);                    
                               ИначеЕсли НоваяСтрока.Вид = 2 Тогда
                                   НоваяСтрока.ВидДокумента = "ПоступлениеНМА";
                                   НоваяСтрока.НомерДокумента = РегламентированнаяОтчетность.ДополнитьСтроку(СокрЛП(ДокНомер), 11, "0", 0);                    
                               ИначеЕсли НоваяСтрока.Вид = 4 Тогда
                                   НоваяСтрока.НомерДокумента = "М-" + РегламентированнаяОтчетность.ДополнитьСтроку(СокрЛП(ДокНомер), 9, "0", 0);                    
                               ИначеЕсли НоваяСтрока.Вид = 5 Тогда
                                   НоваяСтрока.НомерДокумента = "Т-" + РегламентированнаяОтчетность.ДополнитьСтроку(СокрЛП(ДокНомер), 9, "0", 0);                    
                               ИначеЕсли НоваяСтрока.Вид = 6 Тогда
                                   НоваяСтрока.НомерДокумента = "РБП-" + РегламентированнаяОтчетность.ДополнитьСтроку(СокрЛП(ДокНомер), 7, "0", 0);                    
                               Иначе
                                   НоваяСтрока.НомерДокумента = СокрЛП(ДокНомер);
                               КонецЕсли;                  
                           ИначеЕсли НоваяСтрока.ВидДокумента = "ОприходованиеУслуг" Тогда
                               НоваяСтрока.НомерДокумента = "У-" + РегламентированнаяОтчетность.ДополнитьСтроку(СокрЛП(ДокНомер), 9, "0", 0);                    
                           ИначеЕсли (НоваяСтрока.ВидДокумента = "ВыпискаИзБанка") Тогда        
                               НоваяСтрока.НомерДокумента = СокрЛП(ПреобразованиеНомера(ДокНомер, 48));
                           ИначеЕсли (НоваяСтрока.ВидДокумента = "ПереоценкаВалюты") Тогда
                               НоваяСтрока.НомерДокумента = СокрЛП(Формат(ДокДата ,"ДФ=dd.MM.yyyy"));                            
                           Иначе
                               НоваяСтрока.НомерДокумента = СокрЛП(ДокНомер);
                           КонецЕсли;
                           
                           НоваяСтрока.Сумма = V7БИ.ДО() - V7БИ.КО();                            
                           НоваяСтрока.Контрагент = Контрагент;
                           Если ЭлементСпсЗнач.Значение = "РКН" Тогда
                               V7БИ.ВыбратьСубконто(3);
                               Пока V7БИ.ПолучитьСубконто(3) = 1 Цикл
                                   ДокСчет = V7БИ.Субконто(3);
                                   НоваяСтрока.ДокСчет = СокрЛП(ДокСчет.НомерДок);                                    
                               КонецЦикла;
                           КонецЕсли;
                           
                       КонецЦикла;    
                   КонецЦикла;            
               КонецЦикла;            
           КонецЦикла;
           V7БИ          = 0;
           //V7Организация = Неопределено;
       КонецЦикла;        
       V7Счет        = 0;
       //V7Фирма       = Неопределено;
       V7Организация = 0;
       
       
       
       Состояние("Обработка информации, полученной из основной базы...");
       
       СоотвВидовДок = Новый Соответствие;
       СоотвВидовДок.Вставить("БухПереброскаСредств", "Бух. переброска средств");
       СоотвВидовДок.Вставить("ВыпискаИзБанка", "Выписка из банка");        
       
       Для каждого Стр Из ТЗСравнения77 Цикл            
           Если (Стр.ДокОснВид <> "") И (Стр.ДокОснНомер <> "") Тогда            
               СтруктураОтбора = Новый Структура();
               СтруктураОтбора.Вставить("Контрагент",          Стр.Контрагент);                
               СтруктураОтбора.Вставить("ДокСчет",             Стр.ДокСчет);            
               СтруктураОтбора.Вставить("ВидДокумента",        Стр.ДокОснВид);            
               СтруктураОтбора.Вставить("ПредставлениеНомДок", Стр.ДокОснНомер);                
               
               СтрокиКурсРазницы = ТЗСравнения77.НайтиСтроки(СтруктураОтбора);
               
               Если СтрокиКурсРазницы.Количество() > 0 Тогда
                   Для каждого Элемент Из СтрокиКурсРазницы Цикл  
                       Стр.ПредставлениеНомДок        = СокрЛП(Элемент.ПредставлениеНомДок);
                       Стр.НомерДокумента             = СокрЛП(Элемент.НомерДокумента);
                       Стр.ВидДокумента               = Элемент.ВидДокумента;
                       Стр.ПредставлениеВидаДокумента = СоотвВидовДок.Получить(Стр.ДокОснВид);                                                
                   КонецЦикла;                                  
               КонецЕсли;                  
           КонецЕсли;              
       КонецЦикла;                
       
       ТЗВспом77 = "";
       Если НЕ (ТЗДок77 = Неопределено)  Тогда
           ТЗВспом77 = ТЗДок77.Скопировать();
           ТЗДок77.Очистить();        
       КонецЕсли;
       
       ТЗДок77 = ТЗСравнения77.Скопировать(, "НомерДокумента, ПредставлениеНомДок, ПредставлениеВидаДокумента");
       
       Если НЕ (ТЗВспом77 = "") Тогда
           Для каждого Стр Из ТЗВспом77 Цикл
               НоваяСтрока = ТЗДок77.Добавить();
               НоваяСтрока.НомерДокумента      = Стр.НомерДокумента;
               НоваяСтрока.ПредставлениеНомДок = Стр.ПредставлениеНомДок;            
               НоваяСтрока.ПредставлениеВидаДокумента = Стр.ПредставлениеВидаДокумента;            
           КонецЦикла;                                                          
       КонецЕсли;
       ТЗДок77.Свернуть("НомерДокумента, ПредставлениеНомДок, ПредставлениеВидаДокумента");
       
       ТЗСравнения77.Свернуть("КодФирмы, НомерДокумента, ВидДокумента, ПредставлениеВидаДокумента, ДатаДокумента,
                              |Организация, Счет, Контрагент", "Сумма");                            
   Исключение    
       //Закрытие базы после получения данных
       ЗакрытьВ7(в7, параметры);  
   КонецПопытки;        
   
   в7 = 0;
   ЗакрытьВ7(в7, параметры);  
   
   Возврат ТЗСравнения77;
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший