gifts2017

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

Опубликовал Александр Яшкин (VoDo) в раздел Программирование - Практика программирования

В моей работе все чаще и чаще встречаются задачи связи 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(СокрЛП(ТекстСообщения));
   КонецЕсли;

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

 

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. andrewks 06.12.12 08:19
непонятно, в чём новизна или уникальность по сравнению со статьёй http://infostart.ru/public/119982/ ? или с поиском проблемы?
2. Александр Яшкин (VoDo) 06.12.12 08:27
На самом деле я и не претендую на уникальность или новизну.
Естественно я не первопроходец в данном разделе, но надеюсь что моя статейка кому то поможет.

А с поиском видать действительно проблема. Просто когда у меня была задача такого плана на 1С я не нашел ни одного примера.
3. Сергей Карташев (Elisy) 12.12.12 11:13
Компонент Mswinsock.ocx входит в состав Visual Basic 6.0.
Официальная поддержка для VB завершена со стороны Microsoft.
Платный аналог существует, но он максимально открытый и позволяет принимать запросы в несколько потоков. Хотя на стороне 1С все выстраивается в 1 поток.
http://infostart.ru/public/104926/
4. Александр Яшкин (VoDo) 04.02.13 10:52
Платный аналог существует, но он максимально открытый и позволяет принимать запросы в несколько потоков.

Так это уже реклама своего ДЛЛ ? ))
5. andrey P (andrey314) 28.03.14 11:23
Прописываем регистрационные ветки в реестре (иначе ActiveX не лицензируется). Без этого у нас не будут доступны необходимые методы.


Подскажите плис как лицензировать? В гугле найти не получилось :(

Нашел
// Winsock Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d = mlrljgrlhltlngjlthrligklpkrhllglqlrk
6. dir2000 25.11.15 13:33
Подскажите, пожалуйста. У меня получилось использовать этот ActiveX на компе с Windows XP. Но возникла проблема на сервере под управлением Windows Server 2003 64bit. Для иллюстрации проблемы делаю следующее: создаю внешнюю обработку, создаю обычную форму, вставляю этот ActiveX. Элемент на форме появляется, но в свойствах элемента видны лишь 1С-овские свойства и лишь одно 1С-овское событие ПриИзменении(). Специфические свойства и обработчики событий эктивикса в свойствах не видны. Соответственно и программно работать с ним не получается - при попытке получить значение свойства State вываливается ошибка, что такого свойства не существует.
Этот ActiveX уже был зарегистрирован на сервере и лежал в виндовой папке SysWOW64. Версия 6.0.89.88. На компе под Windows XP я использовал версию 6.1.98.13. Но подмена файла и повторная регистрация ничего не дала - получил сообщение об успешной регистрации но проблема осталась.
Другие ActiveX (например, компонента для печати штрих-кодов) успешно вставляются в форму и их специфические свойства/события видны.
7. Максим Савченко (lutic19) 29.06.16 09:53
(6) dir2000, попробуй инициализировать не через ActiveX-технологию, а через Com-объект:

Попытка    
		WinSock = Новый COMОбъект("mswinsock.winsock"); 
	Исключение 
		
		Возврат; 
		
	КонецПопытки; 
...Показать Скрыть


После попробуй вставить объект-ActiveX на элемент формы, должны появиться специфические свойства и обработчики событий, и будет тебе счастье.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа