Простой 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(СокрЛП(ТекстСообщения));
   КонецЕсли;

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

 

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

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

См. также

Запуск сервера хранилища конфигураций и сервера удаленного управления на Linux, посредством systemd

Linux Сервера Платформа 1С v8.3 Абонемент ($m)

Сказ о том, как сделать "кошерный" запуск серверов хранилища конфигураций (вдруг еще кто-то до сих пор пользуется) и удаленного администрирования под GNU/Linux с использованием systemd

1 стартмани

07.09.2023    4309    Sloth    0    

23

Первый день архитектора 1С на новой работе

Мониторинг Сервера Администрирование СУБД Бесплатно (free)

Как быстро познакомиться с системой на новой работе или если вас пригласили провести аудит контура на 1С? О том, какие инструменты использовать для быстрой проверки настроек сервера 1С, сервера MS SQL и общей оценки инфраструктуры на производительность, на конференции Infostart Event 2021 Post-Apocalypse рассказал архитектор 1С Юрий Былинкин.

01.06.2023    10807    ardn    19    

81

Путь самурая. Ставим локальный Сервер взаимодействия

Сервера Администрирование веб-серверов Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подробная пошаговая инструкция (как делал я) установки Сервера взаимодействия версия 22.0.26 на Windows Server 2022. Установка собственного объектного хранилище с помощью системы MinIO (https://min.io/). Настройка Сервера взаимодействия для обмена файлами в сообщениях.

1 стартмани

07.04.2023    12627    VPanin56    40    

72

Быстрое конфигурирование серверов с Ansible

Администрирование веб-серверов Сервера Бесплатно (free)

Всю рутину по обновлению платформы, настройке веб-серверов и серверов хранилищ на всем парке серверов компании можно автоматизировать с помощью удобочитаемых YAML-скриптов Ansible. О том, как написать сценарии такой автоматизации, чтобы запускать их параллельно для группы серверов, на митапе «Инструменты автоматизации рутины в 1С-разработке» рассказал ведущий разработчик компании ПИК Digital Павел Комаров.

26.01.2023    4916    lopatrik    4    

22

Жизнь платформы 1C:Предприятие в кластере Kubernetes

Сервера DevOps и автоматизация разработки Облачные сервисы, хостинг Бесплатно (free)

Во многих сферах запуск приложений в Kubernetes является де-факто стандартом архитектуры, так как это позволяет быстро и эффективно задействовать ресурсы, не затрачивая на это большие деньги. Но с платформой 1С:Предприятие не все так просто, но потенциально возможно. Руслан Жданов на митапе «DevOps в 1С: CI/CD. Непрерывная интеграция и поставка решений на 1С» рассказал про то, как с помощью Kubernetes организовать в облаке управление кластером из серверов 1С и реализовать там тестирование приложений на 1С или запуск скриптов на OneScript.

24.01.2023    9495    ZhdanovR    3    

27

Замена имени сервера в файле ibases.v8i у пользователей в домене через GPO

Сети Сервера Платформа 1С v8.3 Абонемент ($m)

При переезде на новый сервер 1С возникла необходимость подготовить всех пользователей (а их 300+) к этому переезду и желательно не мешая их работе. А если быть точнее, то заменить в их списках информационных баз имя сервера. Итак, что имеем в условии.  Есть сервер 1С с именем  WIN2016.  Необходимо перенастроить всех пользователей на новый сервер с именем SRV1C. Для этого придется либо руками у каждого пользователя исправить записи по каждой базе через открытие 1С, либо поправить файл ibases.v8i, который находится в папке профиля пользователя. Второй вариант более интересен, но лезть на 300+ компьютеров не наш метод.

1 стартмани

30.11.2022    3190    1    dungeonkeeper    13    

5

Трое в лодке, не считая собаки - Автономный сервер 1С

Сервера 8.3.14 Конфигурации 1cv8 Бесплатно (free)

Краткая шпаргалка по Автономному серверу 1С. Описаны основные параметры настройки и быстрый алгоритм развертки на ПК.

17.11.2022    4821    AntoShiK86    9    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. andrewks 1368 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 948 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
Сообщение было скрыто модератором.
...
Оставьте свое сообщение