Суть метода - на машине клиента слушается порт.
Сервер посылает на этот порт строку. В строке - код на встроенном языке 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