приветствую, коллеги
возникла следующая задача: есть несколько баз -- управленческая (старая и очень сильно переделанная под наши нужды УНФ 1.5.4.40 на управляемых формах) и несколько бухгалтерких баз БАС бухгалтерия КОРП, тоже на управляемых, понятное дело, формах, со всеми последними обновлениями (тоже слегка переделанных для корректного взаимодействия с измененной же УНФ, ну да не суть...)
из УНФ идет импорт данных в бухгалтерии через вызов com-объекта на сервере, сервер крутится на windows 2008R2
все это написано давно и работает корректно много лет и вопросов не вызывает (а ранее работало еще в такой связке 7.7 (комплексная) --> 7.7 (бух), потом было 7.7 (комплексная) --> 8.3 (бух) и наконец все пришло к 8.3 (унф) --> 8.3 (бух))
сейчас возникла мысль перенести серверную часть на линукс с выносом этого всего в какой-то ДЦ где-то не в Украине (оно и сейчас в ДЦ, только там недалеко на днях очень сильно прилетело, откуда и возникли мысли убраться отсюда от греха подальше )
так вот, поскольку в линуксе никаких com-объектов нет, решено реорганизовать com-обмен не на сервере, а на клиенте (который все равно на windows, т.к. Fredo и все такое...), с переносом на клиент никаких проблем нет -- вызываем из "тонкого" клиента (бух. КОРП) "толстый" клиент (УНФ), читаем данные в таблицу значений, закрываем com-объект на клиенте, таблицу значений передаем на сервер и там производим создание новых объектов
на клиенте вместо v83.ComConneсtor вызываем v83.Application -- и все работает, не так быстро, но приемлемо
однако, возникла проблема -- вызываемый com-объект после отработки не хочет закрываться никак
платформа БАФ 8.3.15.1887 x64
&НаКлиенте
Процедура _ИмпортДанныхНаКлиенте()
Попытка
_V7 = Новый COMObject("V83.Application"); // _V7 -- это на самом деле v83
Исключение
ПоказатьПредупреждение( ,"Ошибка установки соединения");
Возврат;
КонецПопытки;
СтрокаСоединения = "Srvr=" + _IP_адрес_сервера + "; Ref=" + _Имя_БД + "; Usr=" + _Имя_Пользователя + "; Pwd=" + _Пароль_Пользователя;
Попытка
_V7.Connect(СтрокаСоединения);
Исключение
ПоказатьПредупреждение( ,"Не удалось подключиться к базе");
Возврат;
КонецПопытки;
// дальше читаем данные на клиенте и грузим их в ТЗ, а потом пытаемся закрыть ставщий ненужным com-объект
_V7._ЗавершитьРаботуСистемы(Истина); // вот это не срабатывает, com-объект не закрывается и висит окно подтверждения выхода из программы (как при обычном интерактивном закрытии)
Процедура _ЗавершитьРаботуСистемыПриВызовеИзБухКОРП() Экспорт
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
_V7._ЗавершитьРаботуСистемы(Истина);
_V7._ЗавершитьРаботуСистемыПриВызовеИзБухКОРП();
Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках. Для конфигураций, построенных на БСП: Главное -> Настройки -> Персональные настройки и там есть флажок. В старых конфигурациях через Настройки пользователя.
Насколько необходимо использовать "V83.Application"? Фактически, происходит запуск полноценного клиента. Я всегда все задачи решал через "V83.COMConnector", он сам закрывает соединение.
_V8.СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
_V8.ЗавершитьРаботуСистемы(Ложь);
// это 7.7
V8._ЗавершитьРаботуСистемыПриВызовеИз77();
V8 = 0;
// это модуль клиентского приложения УНФ на 8.3
Процедура _ЗавершитьРаботуСистемыПриВызовеИз77() Экспорт
Выполнить("ЗавершитьРаботуСистемы(Ложь)"); // т.к. в 7.7 нет булевых значений
КонецПроцедуры
andytg @ Сегодня, 15:34
,
вопрос решен (не так, как рекомендовали, но решен )
Vofka @ Сегодня, 8:18
,
да вобщем-то элементарно
в УНФ в модуле клиентского приложения в процедуре ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
добавил такое
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
Если Не ИмяПользователя() = "1С" Тогда
// служебный пользователь, который используется только для операций экспорта-импорта
// ..тут старндартное завершение...
Иначе
ТекстПредупреждения = "";
Отказ = Ложь;
КонецЕсли;
КонецПроцедуры
andytg @ 08.07.25, 13:07
,
upd: на всякий случай (вроде узелка на память )
в такой комбинации не работает присваивание вида
_Соединение = Новый COMObject("V83.Application");
_Соединение .Connect(_СтрокаСоединения);
БазаOLE = _Соединение;
// ^^^^ здесь ошибки не будет...
_Док = БазаOLE.Документы.ЗаказПокупателя.НайтиПоНомеру(_НомерДок, _ДатаДок);
// ^^^^ ...но здесь вылетит ошибка, т.к. на тонком клиенте не доступен менеджер документов
_Док = _Соединение.Документы.ЗаказПокупателя.НайтиПоНомеру(_НомерДок, _ДатаДок);
_Запрос = _Соединение.NewObject("Запрос");
// или
_Отбор = _Соединение.NewObject("Структура");
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua