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

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

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

Автор: vbi 15.06.18, 9:38

8.3.8.2322, УТП для Украины 1.2.8.7Есть обработочка. В обработке клиентское подключение через "MSWinsock.Winsock". Она есть в сети и она отлично работает, вот фрагмент рабочего кода:

Перем WinsocketClient;

Функция АвторизоватьсяНаСервере() Экспорт
     WinsocketClient = Новый COMObject("MSWinsock.Winsock");        
     WinsocketClient.RemoteHost = "localhost";
     WinsocketClient.RemotePort = 12345;
     WinsocketClient.Connect();        
КонецФункции


У меня в модуле обычного приложения прописана серверная часть сокета которая слушает порт 12345 и принимает подключения.
Это все работает, но стоит убрать в нашей обработке глобальную переменную
Перем WinsocketClient;
,как обработка перестает работать. Очевидно что она осуществляет коннект не сразу а после выполнения процедуры "АвторизоватьсяНаСервере()". А так как переменной нет, "WinsocketClient" убивается сразу по завершении процедуры не успев подключится к серверу.
Зачем я это все излагаю. Дело в том, что мне эту обработку-клиент нужно перенести в серверный модуль 1С. Там функция АвторизоватьсяНаСервере() будет дергатся HTTPСервисом. И там никакого клиента и текущего пользователя нет. А в серверном модуле не может быть глобальных переменных.
Вопрос: Как мне после завершении функции "АвторизоватьсяНаСервере" заставить жить переменную "WinsocketClient", чтобы она осуществила "Connect()"?
P.S Или HTTP-сервис выполняется тоже на клиенте? только-что мысль пришла пока писал...

Автор: Batchir 15.06.18, 10:10

Попробуйте написать функцию в общем модуле повторного использования что то типа:

Функция ПолучитьОбъектWinsocketClient() Экспорт
     WinsocketClient = Новый COMObject("MSWinsock.Winsock");        
     WinsocketClient.RemoteHost = "localhost";
     WinsocketClient.RemotePort = 12345;
     WinsocketClient.Connect();
     Возврат WinsocketClient;  
КонецФункции


И её дергать для получения WinsocketClient. На сервере вроде должно отработать и возвращать ранее инициализированный объект при повторном вызове

Автор: vbi 15.06.18, 17:04

Цитата
Попробуйте написать функцию в общем модуле повторного использования что то типа
Гениально! Все работает! Модуль ставим на повторное использование возвращаемых значений в значение "На время сеанса". И в коде перед вызовом "ПолучитьОбъектWinsocketClient()" Вызываем ОбновитьПовторноИспользуемыеЗначения();

Тогда срабатывает при каждом вызове. В итое имеем рабочее решение, когда с помощю сокетов сервер дергает нужного клиента. А клиент уже обращается к данным и делает то что ему положено.

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