Простой TCP сервер с обработкой событий на стороне 1С
В моей работе все чаще и чаще встречаются задачи связи 1С и стороннего оборудования / промышленного софта. В большинстве случаев есть некая внешняя компонента для связи с этим всем. Но эта компонента стоит денег. Плюс не каждого устроит «черный ящик», который что то крутит в себе, и выдает готовый результат. Данная статья в «картинках» покажет как можно реализовать TCP сервер для связи с чем либо «своими руками».
- Описание
- Подробнее
Описание
Приветствую!
Немного лирики. В один прекрасный момент мне поступила задача связать 1С и некую этикировочную машину. Как- не известно. Вроде бы где то есть люди, которые что то знают, но где эти люди – никто не знает. И вот путем терзания поставщика удалось вытрясти мануал на английском, в котором был описан формат взаимодействия через TCP порт. И в связи с этим пришлось написать такое счастье.
Ну и от слов к делу. Для связи по TCP я решил использовать родимую мелкомягкую технологию WinSock (http://ru.wikipedia.org/wiki/Winsock). На основе нее можно написать как и серверную часть, так и клиентскую. Все действа разделяются на несколько этапов:
Общая часть
1) Идем в родимый гугль и ищем winsock.ocx
2) Регистрируем ее в системе (regsvr32)
3) Прописываем регистрационные ветки в реестре (иначе ActiveX не лицензируется). Без этого у нас не будут доступны необходимые методы.
Я думаю что проблем с этими шагами не возникнет ни у кого. Если появились затруднения – в гугле огромное количество статей по этим вопросам.
4) Создаем обработку в 1С
- Добавляем на форму ActiveX
я предпочитаю это делать программно:
ЭлементыФормы.ДобавитьActiveX(«MSWinsock.Winsock»,»WinSock»,Ложь); - Форма – вставить ActiveX — Microsoft WinSock Control, version 6.0
только при данном варианте надо убрать видимость элемента, т.к. у него отсутствует графическое отображение.
5) Определяем необходимые методы объекта
- Error –если произошла какая либо ошибка.
WinSocketError(Элемент, Number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay)
Где:
i. Number – код ошибки ,
ii. Description – Описание ошибки,
iii. Scode – Еще раз код ошибки, но уже в другом типе (LONG)
iv. Source – Источник ошибки,
v. HelpFile – ссылка на справку
vi. HelpContext — контекст справки
vii. CancelDisplay — флаг отмены отображения стандартного окна об ошибке. По умолчанию значение — Истина. Окно не выводится.
- DataArrival – поступление данных
WinSocketDataArrival(Элемент, bytesTotal)
где:
i. bytesTotal – количество принятой информации в байтах
- Connect – успешное подключение к серверу (возникает только на клиенте!)
WinSocketConnect(Элемент) - ConnectionRequest — запрос на подключение клиента (возникает на стороне сервера)
WinSocketConnectionRequest(Элемент, requestID)
где:
i. requestID – Идентификатор клиента
- Close- закрытие сессии
WinsockClose(Элемент) - SendProgress – Возникает при прогрессе передачи данных
WinsockSendProgress(Элемент, bytesSent, bytesRemaining)
где:
i. bytesSent – байт послано
ii. bytesRemaining – байт осталось
- 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(СокрЛП(ТекстСообщения));
КонецЕсли;
Вот и простейший клиент готов.
А дальше все зависит только от вашей фантазии.
Естественно я не первопроходец в данном разделе, но надеюсь что моя статейка кому то поможет.

