Прост TCP сървър с обработка на събития от страна на 1С

Малко текстове. В един момент получих задача да свържа 1С и определена машина за етикетиране. Тъй като не е известно. Изглежда, че някъде има хора, които знаят нещо, но къде са тези хора - никой не знае. И сега, измъчвайки доставчика, успях да изтръгна ръководството на английски, което описва формата на взаимодействие през TCP порта. И в тази връзка трябваше да напиша такова щастие.

Е, от думи към дела. За комуникация през TCP реших да използвам скъпата технология WinSock (http://ru.wikipedia.org/wiki/Winsock). Въз основа на него можете да напишете както сървърната част, така и клиента. Всички действия са разделени на няколко етапа:

обща част

1) Отидете в скъпи Google и потърсете winsock.ocx

2) Ние го регистрираме в системата (regsvr32)

3) Регистрираме клоновете за регистрация в регистъра (в противен случай ActiveX не е лицензиран). Без това няма да разполагаме с необходимите методи.

Мисля, че никой няма да има проблеми с тези стъпки. Ако има някакви затруднения, има много статии в Google по тези въпроси.

4) Създаваме обработка в 1С

  1. Добавете ActiveX към формуляра
    Предпочитам да го правя програмно:
    Елементи на формуляр.AddActiveX ("MSWinsock.Winsock", "WinSock", False);
  2. Формуляр - Вмъкване на ActiveX - Microsoft WinSock Control, версия 6.0
    само с тази опция е необходимо да се премахне видимостта на елемента, тъй като няма графичен дисплей.

5) Дефинирайте необходимите обектни методи

  1. Грешка–Ако е възникнала грешка.
    WinSocketError (Елемент, Номер, Описание, Scode, Source, HelpFile, HelpContext, CancelDisplay)
    Където:

i. Номер - код за грешка,

ii. Описание - Описание на грешката,

iii. Scode - Още веднъж кодът за грешка, но в различен тип (LONG)

iv. Източник - източник на грешка,

vi. HelpContext - Помощен контекст

vii. CancelDisplay - флаг за отмяна на показването на стандартния прозорец за грешка. По подразбиране е True. Прозорецът не се показва.

  1. DataArrival - пристигане на данни
    WinSocketDataArrival (Element, bytesTotal)
    Където:

i. bytesTotal - количество получена информация в байтове

  1. Connect - успешна връзка със сървъра (възниква само на клиента!)
    WinSocketConnect (артикул)
  2. ConnectionRequest - заявка за връзка с клиент (възниква от страна на сървъра)
    WinSocketConnectionRequest (Item, requestID)
    Където:

i. requestID - идентификатор на клиента

  1. Затваряне - затваряне на сесията
    WinsockClose (Елемент)
  2. SendProgress - Възниква, когато прехвърлянето на данни напредва
    WinsockSendProgress (Елемент, bytesSent, bytesRemaining)
    Където:

i. bytesSent - изпратени байтове

ii. bytesRemaining - оставени байтове

  1. SendComplete - завършване на изпращането на данни

Сървърна част

1) Стартирайте самия сървър:
WinSock = Елементи на формуляра.WinSock; // Нашият ActiveX
WinSock.LocalPort = Порт; // Порт, на който ще работи
WinSock.Bind (Порт, "127.0.0.1"); // IP, на който ще слушаме
WinSock.listen (); // Всъщност стартиране на сървъра за слушане

2) В процедурата ConnectionRequest посочваме:
Ако WinSocket.State <> 0 Тогава // Ако имаме активен сокет, преди да приемем нов, текущият трябва да бъде затворен
WinSocket.Close (); // затваряме гнездото
EndIf;
WinSocket.Accept (requestID); // Приемане на нова заявка

3) В процедурата DataArrival:
MessageText = ";
WinSocket.GetData (MessageText); // Получаване на съобщение от сървъра
WinSocket.SendData ("Otvet сървър"); // Определен отговор от сървъра за получаване на информация

Това е всичко. Най-простият сървър е готов. Можете да го телнете и да го тествате. Веднага ще направя резервация, че настройките на кодовата страница (показване на кирилица) зависят от използвания клиент. 1C изпраща всичко на Cp1251.

Клиентска част

1) Инициализираме връзката:
WinSocket.RemoteHost = SokrLP (IP); // Адрес за свързване
WinSocket.RemotePort = SokrLP (порт); // Порт, на който да се свържете
WinSocket.Connect (); // Команда за свързване

Внимание! Състоянието в същата процедура няма да промени WinSocket! Следователно: