Автор: 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
,
Семерка у меня.
Автор: 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С сеанс завершают без проблем.