Каталог решений - Простой TCP сервер с обработкой событий на стороне 1С

Простой TCP сервер с обработкой событий на стороне 1С

Простой TCP сервер с обработкой событий на стороне 1С

В наличии

В моей работе все чаще и чаще встречаются задачи связи 1С и стороннего оборудования / промышленного софта.  В большинстве случаев есть некая внешняя компонента для связи с этим всем. Но эта компонента стоит денег. Плюс не каждого устроит «черный ящик», который что то крутит в себе, и выдает готовый результат. Данная статья в «картинках» покажет как можно реализовать TCP сервер для связи с чем либо «своими руками».

Категория:

Описание

Приветствую!

 Немного лирики. В один прекрасный момент мне поступила задача связать 1С и некую этикировочную машину. Как- не известно. Вроде бы где то есть люди, которые что то знают, но где эти люди – никто не знает. И вот путем терзания поставщика удалось вытрясти мануал на английском, в котором был описан формат взаимодействия через TCP порт. И в связи с этим пришлось написать такое счастье.

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

Общая часть

1)      Идем в родимый гугль и ищем winsock.ocx

2)      Регистрируем ее в системе (regsvr32)

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

Я думаю что проблем с этими шагами не возникнет ни у кого. Если появились затруднения – в гугле огромное количество статей по этим вопросам.

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

  1. Добавляем на форму ActiveX
    я предпочитаю это делать программно:
           ЭлементыФормы.ДобавитьActiveX(«MSWinsock.Winsock»,»WinSock»,Ложь);
  2. Форма – вставить ActiveX — Microsoft WinSock Control, version 6.0
    только при данном варианте надо убрать видимость элемента, т.к. у него отсутствует графическое отображение.

5)      Определяем необходимые методы объекта

  1. Error –если произошла какая либо ошибка.
    WinSocketError(Элемент, Number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay)
    Где:

                                                                          i.          Number – код ошибки ,

                                                                         ii.          Description – Описание ошибки,

                                                                       iii.          Scode – Еще раз код ошибки, но уже в другом типе (LONG)

                                                                       iv.          Source – Источник ошибки,

                                                                        v.          HelpFile – ссылка на справку

                                                                       vi.          HelpContext — контекст справки

                                                                     vii.          CancelDisplay — флаг отмены отображения стандартного окна об ошибке. По умолчанию значение — Истина. Окно не выводится.

  1. DataArrival – поступление данных
    WinSocketDataArrival(Элемент, bytesTotal)
    где:

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

  1. Connect – успешное подключение к серверу (возникает только на клиенте!)
    WinSocketConnect(Элемент)
  2. ConnectionRequest —  запрос на подключение клиента (возникает на стороне сервера)
    WinSocketConnectionRequest(Элемент, requestID)
    где:

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

  1. Close- закрытие сессии
    WinsockClose(Элемент)
  2. SendProgress – Возникает при прогрессе передачи данных
    WinsockSendProgress(Элемент, bytesSent, bytesRemaining)
    где:

                                                                          i.      bytesSent – байт послано

                                                                         ii.      bytesRemaining – байт осталось

  1. SendComplete – завершение отправки данных

 

Серверная часть

 

1)      Запускаем сам сервер:
        WinSock=ЭлементыФормы.WinSock; // Наш ActiveX
        WinSock.LocalPort = Port; // Порт на котором он будет работать
        WinSock.Bind(Port, «127.0.0.1»); // IP на котором будем слушать
        WinSock.listen(); // Собственно сам запуск на прослушку сервера

2)      В процедуре ConnectionRequest указываем:
   Если WinSocket.State <>  0 Тогда // Если у нас есть активный сокет, то перед принятием нового текущий необходимо закрыть
        WinSocket.Close(); // закрывает сокет
    КонецЕсли;
    WinSocket.Accept(requestID); // Принимаем новый запрос

3)      В процедура DataArrival :
   ТекстСообщения = «»;
   WinSocket.GetData(ТекстСообщения); // Принимаем сообщение с сервера
   WinSocket.SendData(«Otvet server «);  // Некий ответ сервера на получение информации

Вот и все. Простейший сервер готов.  Можно стучать на него по телнету и тестировать. Сразу оговорюсь, что настройки кодовой страницы (отображение кириллицы) зависит именно от используемого клиента. 1С все отсылает в Cp1251.

 

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

1)      Инициализируем подключение:
 WinSocket.RemoteHost = СокрЛП(IP); // Адрес, на который соединяемя
 WinSocket.RemotePort = СокрЛП(Port); // Порт, по которому соединяемя
 WinSocket.Connect(); // Команда на соединение

Внимание! Статус в этой же процедуре WinSocket не изменит! Поэтому:

2)      В процедуре Connect:
Сообщить(WinSocket.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
Ошибка

3)      Процедура отправки данных:
   Если WinSocket1.State = 7 тогда //Отправляем данные только при статусе «Подключен»
WinSocket1.SendData(СокрЛП(ТекстСообщения));
   КонецЕсли;

Вот и простейший клиент готов.

 

А дальше все зависит только от вашей фантазии.

Естественно я не первопроходец в данном разделе, но надеюсь что моя статейка кому то поможет.

has been added to your cart:
Оформление заказа