Приветствую!
Немного лирики. В один прекрасный момент мне поступила задача связать 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(СокрЛП(ТекстСообщения));
КонецЕсли;
Вот и простейший клиент готов.
А дальше все зависит только от вашей фантазии.
Естественно я не первопроходец в данном разделе, но надеюсь что моя статейка кому то поможет.