Простий TCP сервер з обробкою подій на стороні 1С

Небагато лірики. Одного разу мені надійшло завдання зв'язати 1С і якусь етикувальну машину. Як-не відомо. Начебто десь є люди, які щось знають, але де ці люди – ніхто не знає. І ось шляхом мук постачальника вдалося витрусити мануал англійською, в якій був описаний формат взаємодії через TCP порт. І через це довелося написати таке щастя.

Ну і від слів до діла. Для зв'язку з TCP я вирішив використовувати рідну дрібном'яку технологію WinSock (http://ua.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 – Джерело помилки,

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 не змінить! Тому: