Простий TCP сервер з обробкою подій на стороні 1С
Небагато лірики. Одного разу мені надійшло завдання зв'язати 1С і якусь етикувальну машину. Як-не відомо. Начебто десь є люди, які щось знають, але де ці люди – ніхто не знає. І ось шляхом мук постачальника вдалося витрусити мануал англійською, в якій був описаний формат взаємодії через TCP порт. І через це довелося написати таке щастя.
Ну і від слів до діла. Для зв'язку з TCP я вирішив використовувати рідну дрібном'яку технологію WinSock (http://ua.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 – Джерело помилки,
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 не змінить! Тому: