Версия для печати темы (https://pro1c.org.ua/index.php?s=b5b8e8afeea432db27989c0a6af060b2&showtopic=59153)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Подключение к базе через OLE.

Автор: Talkman 22.05.20, 15:37

Добрый день. Есть две базы 1С 7.7 ПУБ глубоко переработанные. 1С 7.7 0,27. Конфигурации идентичные. Сделал отчет анализа продаж с подключением из одной базы 1С в другую по OLE. Отчет работает, показывает нужные данные, но после завершения процедуры анализа сеанс 1С, созданный OLE подключением не закрывается. Итого 5-7 нажатий кнопки анализировать и в системе висит куча сеансов 1С. Вопрос: как правильно завершать подключение по OLE, чтобы оно закрывалось после завершения процедуры. Мой пример подключения по OLE (кусок кода).
Код

    Там = СоздатьОбъект("V77.Application"); 
    КаталогБазыОЛе  = СокрЛП(Константа.Туда);
    ПользовательОле = "***";
    ПарольОле       = "***";
    МонопольныйРежимOLE = ""; // для немонопольного запуска указать пустую строку!
    ЗапускБезЗаставки = 0;       // для появления заставки (например, чтобы наблюдать
    // процесс запуска базы OLE визуально) поставьте здесь "0"
    РезультатПодключения = Там.Initialize ( Там.RMTrade , "/d" + СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле) +    " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE, ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
    Если РезультатПодключения = 0 Тогда
        Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
    КонецЕсли;  

        Би = СоздатьОбъект("БухгалтерскиеИтоги");
    Би.ИспользоватьСубконто(ВидыСубконто.МестаХранения,Склад,2);
    Би.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СТМЦ);
    Би.ВыполнитьЗапрос(КонДата, КонДата, "281");
    Би.ВыбратьСубконто(ВидыСубконто.ТМЦ);
    Пока Би.ПолучитьСубконто(ВидыСубконто.ТМЦ) = 1 Цикл                                    //Анализ остатков на магазине эта база
        Если Би.СКД(3) <= 0 Тогда
            Продолжить;
        КонецЕсли;
        Ы = "";
        Т.НайтиЗначение(Би.Субконто(ВидыСубконто.ТМЦ),Ы,"Т");
        Т.ПОлучитьСтрокуПоНомеру(Ы);
        Т.ОстМ = Би.СКД(3);  
        Состояние("Заполнение остатками в этой базе");
    КонецЦикла;        
    
    СкладТам = Там.CreateObject("Справочник.МестаХранения");
    Если СкладТам.НайтиПоНаименованию(СокрЛП(Склад.Наименование),0) = 0 ТОгда
        Сообщить("Не могу там найти склад "+СокрЛП(Склад.Наименование));  
        возврат;
    КонецЕсли;    
    СТМЦТам = Там.CreateObject("СписокЗначений");
    ТМЦТАМ = Там.CreateObject("Справочник.ТМЦ");
    Т.ВыбратьСтроки();
    Пока Т.ПолучитьСтроку() = 1 Цикл
        Если ТМЦТам.НайтиПоКоду(Т.Код,0) = 1 Тогда
            СТМЦТам.ДобавитьЗначение(ТМЦТам.ТекущийЭлемент());
            Состояние("Формирование списка товаров для анализа в ТОЙ базе")
        КонецЕсли;    
    КонецЦикла;    
    БиТам = Там.CreateObject("БухгалтерскиеИтоги");
    БиТам.ИспользоватьСубконто(Там.ВидыСубконто.МестаХранения,СкладТам,2);
    БиТам.ИспользоватьСубконто(Там.ВидыСубконто.ТМЦ,СТМЦТам);
    БиТам.ВыполнитьЗапрос(КонДата, КонДата, "281");                                           //Анализ остатков на магазине ТА база
    БиТам.ВыбратьСубконто(Там.ВидыСубконто.ТМЦ);
    Пока БиТам.ПолучитьСубконто(Там.ВидыСубконто.ТМЦ) = 1 Цикл
        Если БиТам.СКД(3) <= 0 Тогда
            Продолжить;
        КонецЕсли;
        Ы = "";  
        Т.НайтиЗначение(БиТам.Субконто(Там.ВидыСубконто.ТМЦ).Код,Ы,"Код");
        Т.ПОлучитьСтрокуПоНомеру(Ы);
        Т.ОстМ = Т.ОстМ + БиТам.СКД(3);
        Состояние("Заполнение остатками в Той базе");
    КонецЦикла;

Автор: denis84 22.05.20, 15:56

Talkman @ Сегодня, 16:37 * ,
Добрый день! В 1с 8 РазорватьСоединение();

Автор: Talkman 22.05.20, 15:58

denis84 @ Сегодня, 16:56 * ,
Семерка у меня.

Автор: wanjaas 22.05.20, 16:29

Там = "";

Автор: Naghual 22.05.20, 16:56

Перед Там = "";
Выполнить Там.ЗавершениеРаботыСистемы.
(как-то так. пишу по памяти)

Автор: sava1 22.05.20, 17:06

убрать вопрос у пользователя про завершение работы

Автор: denis84 23.05.20, 11:39

Talkman @ Вчера, 16:37 * ,
Добрый день! Вот такой вариант

 
БазаОЛЕ.ЗавершитьРаботуСистемы(0);


Автор: nik389 23.05.20, 12:19

убрать вопрос, как вам подсказали, это первое
если все равно остается в памяти, убивать все переменные, являющиеся потомками Там = СоздатьОбъект("V77.Application"); , и сам Там тоже

Автор: Talkman 25.05.20, 6:40

Сегодня опробую, спасибо.

Автор: Talkman 25.05.20, 8:00

Вопрос при завершении работы системы отсутствует. Я грешу на ДЛЛку BARCODE. Она после завершения сеанса 1С выдает рекламное сообщение. Хотя меня смущает, что такие же оле подключения в коде других объектах 1С сеанс завершают без проблем.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua