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