Работа с Windows Sockets в 1С Предприятие.


При интеграции 1С:Предприятие с другими системами возможны случаи когда работа возможна только по протоколам TCP\IP или UDP. Платформа 1С не предоставляет механизмов для прямого взаимодействия с этими протоколами, что крайне неудобно, но, тем не менее, не невозможно.
Для работы с этими протоколами в среде Windows предназначена технология Windows Sockets.  
Реализует эту технологию  библиотека Mswinsock.dll (Mswinsock.ocx).

В качестве транслятора в протоколы TCP\IP или UDP данных из (в) 1С:Предприятие можно использовать ActiveX компоненту, входящую в состав библиотеки Mswinsock.dll.

Эта библиотека входит в состав пакета Visual Basic который можно установить вместе с пакетом программ MS Office. Ну или найти в Интернете.

Её полноценное использование в среде 1С:Предприятие возможно только в качестве ActiveX элемента на форме.

03_02_1 03_02_2

 

На форме появится значок с двумя компьютерами, примерно такой (все зависит от используемой вами операционной системы и версии библиотеки).

03_02_3_copy

Не забудьте для компоненты снять флажок видимости. Компонент не имеет элементов интерфейса, тем не менее 1С пытается его отрисовать, что приводит к некрасивым результатам.

03_02_6

После добавления компонента на форму становятся доступными все связанные с ним свойства и события. Наиболее часто используемые события добавляются на форму свойств.

События и свойства

Остальные свойства и события доступны через контекстную подсказку "IntelliSense" в модуле формы.

Контекстная подсказка

 

Свойства.

Из дополнительных свойств стоит отдельно выделить свойство "State" в это свойство содержит числовое значение текущего состояния компоненты - Статус.

Список возможных значений

Состояние Числовое значение Описание
sckClosed 0 Default. Closed
Значение по умолчанию. Подключение закрыто.
sckOpen 1 Open
Подключение активно. Соединение установлено.
sckListening 2 Listening
Режим "прослушки". Компонента ждет подключение по указанному порту.
sckConnectionPending 3 Connection pending
Ожидание подключения
sckResolvingHost 4 Resolving host
Получение адреса компьютера (хоста) по имени.
sckHostResolved 5 Host resolved
Адрес компьютера получен.
sckConnecting 6 Connecting
Подключение
sckConnected 7 Connected
Подключен
sckClosing 8 Peer is closing the connection
Клиент закрыл подключение
sckError 9 Error
Ошибка

Свойство Protocol содержит числовой параметр, указывающий, с каким протоколом работать. Protocol принимает одно из двух возможных значений

  • 0 - протокол TCP/IP
  • 1 - Протокол UDP

Свойство LocalPort числовой параметр, указывающий, какой порт будем прослушивать функцией Listen().

Свойства RemotePort и RemoteHost - это параметры, указывающие по какому адресу (IP или DNS) и на какой порт совершать подключение к серверу функцией Connect().

Для каждого параметра есть одноименная функция, которая возвращает текущее значение параметра или устанавливает новое значение. За исключением параметра State, для разработчика этот параметр ReadOnly.

 

Доступные события.

Error - Событие возникает при возникновении какой-либо ошибки.

Процедура WinSocketError(Элемент, Number, Description, Scode, Source, HelpFile,HelpContext, CancelDisplay)

    Сообщить(Description);

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

В параметрах события возвращается

  • Number - цифровой код возникшей ошибки,
  • Description - текстовое описание ошибки,
  • Scode - код ошибки в типе Long (HRESULT) SCODE
  • Source - описание источника ошибки,
  • HelpFile - ссылка на Файл справки
  • HelpContext - контекст файла справки
  • CancelDisplay - флаг отмены отображения стандартного окна об ошибке. По умолчанию значение - Истина. Окно не выводится.

DataArrival - возникает при поступлении данных.

Процедура WinSocketDataArrival(Элемент, bytesTotal)

   
ТкстСообщения = "";
   
WinSocket1.GetData(ТкстСообщения);
   
Сообщить("Получен ответ" + Символы.ПС + ТкстСообщения);

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

В параметр bytesTotal передается числовое значение, сколько байт было принято. Сами данные можно получить функцией GetData(). В параметр этой функции нужно передать строковую переменную, в которую функция вернет полученные данные.

Connect - событие возникает при успешном подключении к серверу. Возникает только на стороне клиента.

Процедура WinSocketConnect(Элемент)

    Сообщить("Покдлючение к " + Элемент.RemoteHost + " успешно.");

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

Это событие не имеет собственных параметров.можно работать только с параметрами самой компоненты.

ConnectionRequest - серверное событие, возникает при поступлении запроса на подключение.

Процедура WinSocketConnectionRequest(Элемент, requestID)

    Сообщить("Запрос подключения");

    Сост = "Подключение";

    Если НЕ
WinSocket.State = 0 Тогда
        WinSocket.Close()
    КонецЕсли;

    WinSocket.Accept(requestID);

    Сообщить("Приконнектился "+WinSocket.RemoteHostIP);

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

В параметр requestID поступает идентификатор подключаемого клиента. При этом, обратите внимание, что перед разрешением на подключение функцией Accept(requestID) необходимо компоненту перевести в состояние "0", т.е. закрыть открытый прослушиваемый поток.

Тут же можем получить IP-адрес подключаемого клиента из параметра RemoteHostIP.

Теперь, после установления соединения, можем передавать данные в обе стороны.

Close - Событие, возникающее при вызове метода Close() т.е. при закрытии компоненты.

SendProgress - Событие, возникающее при передаче данных, возникает при каждом переданном байте - так что не стоит навешивать слижком громоздкую или ресурсоемкую логику. Да и как показала практика, в 1С это событие использовать нет смысла, потому как процедура, связанная с этим событием, срабатывает только 1 раз, когда форма получает обратно фокус ввода.

Следующая процедура выводит прогресс отправки в окно служебных сообщений. По сути должна выводить сообщение для каждого отправленного байта. Но следующая картанка показывает что это не так.

Процедура WinSocketSendProgress(Элемент, bytesSent, bytesRemaining)

    Сообщить("Байт отправленно - " + bytesSent + "/ байт осталось - " + bytesRemaining);

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

Из картинки видно, что вызов процедуры произошел только один раз.

Результат вызова процедуры

 

SendComplete - Событие, возникающее при завершении отправки данных. Следующий код демонстрирует функционирование данного события.

Процедура WinSocketSendComplete(Элемент)

    Сообщить("-----------------------------------");
    Сообщить("" + + ТекущаяДата() + " |Отправка данных завершена! ");
    Сообщить("-----------------------------------");

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

Ну и сам результат вызова.

Пример вызова события

 Оригинал статьи на nastroy-ka.ru

Файлы обработки:

-