Вызов клиента из фонового задания (с сервера), используя протокол TCP.


В примере используется COM объект MSWinsock для организации прослушки TCP порта и отправки сообщения по протоколу TCP.

Суть метода — на машине клиента слушается порт.

Сервер посылает на этот порт строку. В строке — код на встроенном языке 1С:Предприятия.

Клиент эту строку выполняет встроенной функцией Выполнить()

 

За основу взята разработка Работа с Windows Sockets в 1С Предприятие и комментарии к ней. Допилил, чтобы обработка работала на сервере. Для этого пришлось отказаться от использования ActiveX элемента формы — вместо него используется Новый COMОбъект("MSWinsock.Winsock").

Обработчики событий подключаются оператором ДобавитьОбработчик:

ДобавитьОбработчик WinSocket.Connect, ПриПодключении;

Где

  • WinSocket — COM объект
  • Connect — событие COM объекта
  • ПриПодключении — Процедура текущего модуля (обработчик события)

Для тех, кому лень скачивать и смотреть код, приведу минимально необходимый кусок кода:

Отправка данных:

Перем WinsocketClient;
Перем КодДляПередачи;
Функция ВыполнитьКодНаРМ(Хост, Код) Экспорт
Порт = 33338;
КодДляПередачи = Код;
WinsocketClient = Новый COMObject("MSWinsock.Winsock");
ДобавитьОбработчик  WinsocketClient.Connect, ПриПодключенииКлиентаКсерверу;
WinsocketClient.RemoteHost = Хост;
WinsocketClient.RemotePort = Порт;
Попытка
WinsocketClient.Connect();
// само подключение состоится только после выхода из текущего метода
// после подключения выполнится ПриПодключенииКлиентаКсерверу
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции

Процедура ПриПодключенииКлиентаКсерверу() Экспорт
Если ЗначениеЗаполнено(КодДляПередачи) Тогда
WinsocketClient.SendData(КодДляПередачи);
КонецЕсли;
УдалитьОбработчик WinsocketClient.Connect, ПриПодключенииКлиентаКсерверу;
КонецПроцедуры

Получение:

Перем Winsocket Экспорт;
Функция ИнициализацияСервера() Экспорт
Порт = 33338;
Попытка
Winsocket = Новый COMОбъект("MSWinsock.Winsock");
WinSocket.LocalPort  = Порт;
ДобавитьОбработчик  WinSocket.ConnectionRequest, ЗапросПодключения;
ДобавитьОбработчик  WinSocket.DataArrival, ПриПолученииДанных;
ДобавитьОбработчик  WinSocket.Close, ПриЗакрытииСоединения;
Если WinSocket.State <> 7 Тогда
Если WinSocket.State <> 0 Тогда
WinSocket.Close();
КонецЕсли;
WinSocket.Protocol = 0;
WinSocket.Listen();
КонецЕсли;
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции

Процедура ЗапросПодключения(requestID) Экспорт
State = Winsocket.State;
Если State <> 0 Тогда
Winsocket.Close();
КонецЕсли;

Winsocket.Accept(requestID);
Winsocket.Listen();

КонецПроцедуры

Процедура ПриПолученииДанных(КоличествоБайт) Экспорт
ТекстСообщения = "";
WinSocket.GetData(ТекстСообщения);
ПерезапуститьСервер();
ОбработатьСообщение(ТекстСообщения);
КонецПроцедуры

Процедура ОбработатьСообщение(ТекстСообщения)
Попытка
Выполнить(ТекстСообщения);
Исключение
// TODO
КонецПопытки;
КонецПроцедуры

Процедура ПриЗакрытииСоединения() Экспорт
ПерезапуститьСервер();
КонецПроцедуры

Процедура ПерезапуститьСервер()
WinSocket.Close();
WinSocket.Listen();
КонецПроцедуры

Вообще, оператор ДобавитьОбработчик незаслуженно редко используется. Например, в известных мне инструментах для подсветки 1С кода он не подсвечивается, как оператор.

Код тестировался на платформе 8.3.10.2561
 

1 Comment

  1. alexspiter

    Нечто подобное пробовали на УФ реализовать, но не получалось когда шел запрос на подключение (WinSocket.ConnectionRequest) клиентское приложение крэшилось по непонятным причинам (ошибка ничего не давала — сбой платформы). А у вас на УФ работало?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *