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

05.12.12

Администрирование - Сервера

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

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

 

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

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

См. также

Администрирование веб-серверов Сервера Системный администратор Программист Абонемент ($m)

WEB приложение для управления сеансами сервера 1С, имеет адаптивный web интерфейс. Возможности: удаление сеансов; завершение rphost процессов; запуск службы 1С сервера (если остановлена). Используется авторизация BasicAuth с защитой от брутфорса. Поддерживает работу по http https протоколам.

1 стартмани

08.11.2024    494    7    gortrex    2    

3

Облачные сервисы, хостинг Linux Тестирование QA Сервера Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Завершающая публикация цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием, отказоустойчивостью и прочая, прочая... В этой статье мы определяемся с быстродействием системы, проводим нагрузочное тестирование и отпускаем ее в свободное плавание (зачеркнуто) выпускаем ее в продуктовый контур, где, конечно же, придется отлавливать ошибки, мониторить состояние и т.п.

31.10.2024    1392    capitan    0    

0

Сервера Системный администратор Бесплатно (free)

На первый взгляд, добавление второго сервера в кластер 1С не должно вызывать проблем – все просто должно работать. Но на практике дело обстоит иначе. Несмотря на то, что все действительно работает, многие при этом сталкиваются с трудностями. Расскажем, когда нужно задуматься о втором сервере 1С в кластере, какие особенности работы второго сервиса с файлами и сервисами, и какие настройки ТНФ можно сделать для лицензий ПРОФ и КОРП.

31.10.2024    8395    a.doroshkevich    21    

68

Сервера Системный администратор Программист Бесплатно (free)

Отдельный сервер лицензирования упрощает администрирование лицензий в сложных структурах с несколькими кластерами и тысячами пользователей. Расскажем о том, как настроить резервирование лицензий для крупной компании с высокими требованиями к доступности SLA 99.98% и автоматизировать переактивацию лицензий в случае возможных сбоев.

29.10.2024    2158    jul.dolganova    8    

16

Облачные сервисы, хостинг Linux Сервера Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Одна из завершающих публикаций цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием и прочая, прочая... На закуску разбираемся с отказоустойчивостью. В этой публикации для серверов 1С заодно попробуем подобно сериалу «Разрушители легенд» подтвердить или опровергнуть пару устойчивых мифов о требованиях назначения функциональности.

18.10.2024    1815    capitan    5    

12

Сервера Системный администратор Россия Бесплатно (free)

Основные критерии, на которые необходимо обратить внимание.

31.07.2024    2384    EFSOL_oblako    2    

1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. andrewks 1375 06.12.12 08:19 Сейчас в теме
непонятно, в чём новизна или уникальность по сравнению со статьёй http://infostart.ru/public/119982/ ? или с поиском проблемы?
2. VoDo 72 06.12.12 08:27 Сейчас в теме
На самом деле я и не претендую на уникальность или новизну.
Естественно я не первопроходец в данном разделе, но надеюсь что моя статейка кому то поможет.

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

Так это уже реклама своего ДЛЛ ? ))
5. andrey314 14 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 на элемент формы, должны появиться специфические свойства и обработчики событий, и будет тебе счастье.
8. пользователь 04.06.20 10:57
Сообщение было скрыто модератором.
...
Оставьте свое сообщение