Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> импорт данных через COM-объект из "толстого" в "тонкий" клиент          
andytg Подменю пользователя
сообщение 06.07.25, 1:23
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 53
Из: Киев
Спасибо сказали: 17 раз
Рейтинг: 14

приветствую, коллеги

возникла следующая задача: есть несколько баз -- управленческая (старая и очень сильно переделанная под наши нужды УНФ 1.5.4.40 на управляемых формах) и несколько бухгалтерких баз БАС бухгалтерия КОРП, тоже на управляемых, понятное дело, формах, со всеми последними обновлениями (тоже слегка переделанных для корректного взаимодействия с измененной же УНФ, ну да не суть...)

из УНФ идет импорт данных в бухгалтерии через вызов com-объекта на сервере, сервер крутится на windows 2008R2

все это написано давно и работает корректно много лет и вопросов не вызывает (а ранее работало еще в такой связке 7.7 (комплексная) --> 7.7 (бух), потом было 7.7 (комплексная) --> 8.3 (бух) и наконец все пришло к 8.3 (унф) --> 8.3 (бух))

сейчас возникла мысль перенести серверную часть на линукс с выносом этого всего в какой-то ДЦ где-то не в Украине (оно и сейчас в ДЦ, только там недалеко на днях очень сильно прилетело, откуда и возникли мысли убраться отсюда от греха подальше smile.gif)

так вот, поскольку в линуксе никаких 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._ЗавершитьРаботуСистемыПриВызовеИзБухКОРП();


тоже ни к чему не приводят (хотя при точно таком же вызове этой же УНФ из другой БД на старой бухгалтерии 7.7 этот второй вариант нормально отрабатывает)

вопрос -- как в этом случае заставить закрыться com-объект без вывода окна запроса подтверждения закрытия программы?

перепробовал разные варианты -- ни один ни помогает

спасибо

p.s. конвертацию данных не предлагать -- я её не знаю, за 25+ лет работы с 1с никогда с ней не сталкивался и не планирую smile.gif wink.gif

Цитата(andytg @ 06.07.25, 2:08) *
_V7._ЗавершитьРаботуСистемы(Истина);


прошу прщения, не Истина, а конечно же Ложь в качестве аргумента

но все равно не работает smile.gif

xlmel Подменю пользователя
сообщение 06.07.25, 10:51
Сообщение #2

Говорящий
***
Группа: Пользователи
Сообщений: 59
Из: Харьков
Спасибо сказали: 32 раз
Рейтинг: 34.7

Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках. Для конфигураций, построенных на БСП: Главное -> Настройки -> Персональные настройки и там есть флажок. В старых конфигурациях через Настройки пользователя.
Насколько необходимо использовать "V83.Application"? Фактически, происходит запуск полноценного клиента. Я всегда все задачи решал через "V83.COMConnector", он сам закрывает соединение.

Спасибо сказали: andytg,

andytg Подменю пользователя
сообщение 06.07.25, 11:15
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 53
Из: Киев
Спасибо сказали: 17 раз
Рейтинг: 14

Цитата(xlmel @ 06.07.25, 11:51) *
Насколько необходимо использовать "V83.Application"? Фактически, происходит запуск полноценного клиента. Я всегда все задачи решал через "V83.COMConnector", он сам закрывает соединение.

я сейчас и использую V83.COMConnector и всегда использовал (ну, кроме 7.7, где его не было, а был только V77.Application) -- он в разы быстрее и удобнее

но мысль такая -- попробовать использовать сервер 1c не на windows, а на линукс, где com-технология не поддерживается -- поэтому возникла мысль перенести обмен с сервера на клиентскую машину, где windows есть и будет в любом случае (точнее, ту часть обмена, которая читает данные из вызываемой базы, потом com-соединение закрываем, считанные данные передаем на сервер и там обрабатываем уже без всяких com-технологий)

за идею про флажок спасибо, как-то упустил из виду sad.gif

andytg Подменю пользователя
сообщение 07.07.25, 14:34
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 53
Из: Киев
Спасибо сказали: 17 раз
Рейтинг: 14

Цитата(xlmel @ 06.07.25, 11:51) *
Главное -> Настройки -> Персональные настройки и там есть флажок

увы, не помогает
ни снятие флажка, ни даже такое
    _V8.СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы();
    _V8.ЗавершитьРаботуСистемы(Ложь);

при этом ровно с этой же конфигурацией, но вызываемой из 7.7, нормально работает такой вариант:
// это 7.7
    V8._ЗавершитьРаботуСистемыПриВызовеИз77();
    V8 = 0;

при этом в восьмерке, в модуле клиентского приложения
// это модуль клиентского приложения УНФ на 8.3
Процедура _ЗавершитьРаботуСистемыПриВызовеИз77()    Экспорт
    Выполнить("ЗавершитьРаботуСистемы(Ложь)");  // т.к. в 7.7 нет булевых значений
КонецПроцедуры

одна и та же база при вызове из 7.7 не задает никаких вопросов и корректно закрывается, а при вызове из 8.3 выводит окно запроса



andytg Подменю пользователя
сообщение 07.07.25, 18:45
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 53
Из: Киев
Спасибо сказали: 17 раз
Рейтинг: 14

andytg @ Сегодня, 15:34 * ,
вопрос решен (не так, как рекомендовали, но решен wink.gif)

Vofka Подменю пользователя
сообщение 08.07.25, 7:18
Сообщение #6

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14058
Из: Киев
Спасибо сказали: 4621 раз
Рейтинг: 3758.9

andytg @ Вчера, 19:45 * ,
может расскажете как?

andytg Подменю пользователя
сообщение 08.07.25, 12:07
Сообщение #7

Говорящий
***
Группа: Пользователи
Сообщений: 53
Из: Киев
Спасибо сказали: 17 раз
Рейтинг: 14

Vofka @ Сегодня, 8:18 * ,
да вобщем-то элементарно wink.gif

в УНФ в модуле клиентского приложения в процедуре ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)

добавил такое
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)

    Если Не ИмяПользователя() = "1С" Тогда
        // служебный пользователь, который используется только для операций экспорта-импорта

                // ..тут старндартное завершение...
        
    Иначе
        
        ТекстПредупреждения = "";
        Отказ = Ложь;

        КонецЕсли;
КонецПроцедуры

ну и соответственно, обработка экспорта-импорта запускается от имени пользователя с именем "1С"

andytg Подменю пользователя
сообщение 10.07.25, 19:04
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 53
Из: Киев
Спасибо сказали: 17 раз
Рейтинг: 14

andytg @ 08.07.25, 13:07 * ,
upd: на всякий случай (вроде узелка на память wink.gif)
в такой комбинации не работает присваивание вида
_Соединение = Новый COMObject("V83.Application");
_Соединение .Connect(_СтрокаСоединения);
БазаOLE = _Соединение;
//    ^^^^ здесь ошибки не будет...
_Док = БазаOLE.Документы.ЗаказПокупателя.НайтиПоНомеру(_НомерДок, _ДатаДок);
//   ^^^^ ...но здесь вылетит ошибка, т.к. на тонком клиенте не доступен менеджер документов

но если присваивание не использовать, а вместо этого везде писать, например, так
_Док = _Соединение.Документы.ЗаказПокупателя.НайтиПоНомеру(_НомерДок, _ДатаДок);

обращаясь к менеджеру документов толстого клиента, то все работает нормально и всевозможные обращения вида
_Запрос = _Соединение.NewObject("Запрос");
// или
_Отбор = _Соединение.NewObject("Структура");

работают нормально, т.е. менеджер объектов из толстого клиента успешно возвращает все, что требуется, в тонкий клиент
хотя, скорость, конечно, в разы медленнее, чем при использовании com-коннектора на сервере
но требуемый результат успешно достигнут smile.gif


Спасибо сказали: Vofka,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 18.07.25, 6:07
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!