Простой скрипт для работы с ТСД

Небольшой скрипт, исполняемый в среде OneScript, реализует работу TCP-сервера с telnet-клиентом ТСД. Позволяет проводить инвентаризацию товара по штрих кодам с сохранением результатов и протокола в реальном времени на компьютер. Для работы нужен ТСД, имеющий Wi-Fi интерфейс и telnet-клиент.

Как это работает

Для запуска (компиляции) скрипта потребуется OneScript, инструкция по его использованию здесь.

Скрипт последовательно считывает входящий текстовый поток с ТСД, и когда получает завершающий символ строки или полный код (во второй версии скрипта), обрабатывает полученный код и возвращает ответ терминалу.

При запуске скрипт создает файл результатов и файл протокола. Имена файлов содержат текущую дату и код магазина, указанный как параметр при запуске скрипта. Протокол работы ТСД также отображается на сервере в окне командной строки, где запущен скрипт.

Скрипт работает с штрих-кодами EAN13. Каждый промаркированный товар имеет свой уникальный штрих код, состоящий из кода номенклатуры и порядкового номера. Для определения наименования номенклатуры, скрипт подгружает данные из xml файла выгрузки справочника номенклатуры.

Сканер ТСД отправляет отсканированный код скрипту, а он возвращает текущее насчитанное количество данной номенклатуры. В случае повторного сканирования кода, на терминал выводится предупреждающий сигнал и сообщение о повторе кода, количество не увеличивается. Код также можно ввести вручную с клавиатуры ТСД.

В процессе работы можно просмотреть текущие результаты подсчета. Для этого на клавиатуре ТСД нужно нажать 1, завершить работу скрипта — 9. В случае перезапуска скрипта, он подгрузит сохраненные результаты работы. В случае обрыва связи с сервером подсчета кодов не происходит.

Скрипт устанавливает только одно соединение, поэтому при необходимости одновременной работы с несколькими ТСД, можно запускать несколько экземпляров скрипта на разных портах. Скрипт тестировался с клиентом TelnetCE в режиме эмуляции VT200 и кодировкой windows-1251. Вторая версия тестировалась с клиентом ConnectBot под Android.

Немного кода

Процедура работы с клиентом:

Процедура ЗапуститьСервер(Порт)

Сервер = Новый TCPСервер(Порт);
Сервер.Запустить();
ПротоколСообщить("Сервер запущен");
Пока НЕ ОстановитьСервер Цикл
Соединение = Неопределено;
Пока Соединение = Неопределено Цикл
Соединение = Сервер.ОжидатьСоединения(100);
КонецЦикла;
Запрос = "";
ЗапросСтрока = "";
ПротоколСообщить("Соединение установлено");
Пока Соединение.Активно И НЕ ОстановитьСервер Цикл
Если Запрос = "" Тогда
Попытка
ЗапросСтрока = ЗапросСтрока + Соединение.ПрочитатьСтроку("windows-1251");
Исключение
Продолжить
КонецПопытки;
Если НЕ Прав(ЗапросСтрока, 1) = Символы.ВК Тогда
Продолжить
КонецЕсли;
Запрос = СтрЗаменить(ЗапросСтрока, Символы.ПС, "");
Запрос = СтрЗаменить(Запрос, Символы.ВК, "");
Запрос = СтрЗаменить(Запрос, "A", "");
ЗапросСтрока = "";
ТекВремя = Формат(ТекущаяДата(), "ДЛФ=T");
Если СтрДлина(Запрос) = 1 Тогда
Если Запрос = "1" Тогда
ПоказатьРезультаты();
ИначеЕсли Запрос = "2" Тогда
Прервать;
ИначеЕсли Запрос = "9" Тогда
ОстановитьСервер = Истина;
КонецЕсли;
Запрос = "";
ИначеЕсли СтрДлина(Запрос) = 13 Тогда
Код = Сред(Запрос, 2, 6);
ТекКоличество = Количество.Получить(Код);
Если НЕ ТекКоличество = Неопределено Тогда
ТекКоличество = 1 + ТекКоличество;
Ответ = "" + ТекКоличество + " - " + Номенклатура.Получить(Код) + " - " + Запрос;
НайтиПовтор = ШхКоды.Получить(Запрос);
Если НЕ ЗначениеЗаполнено(НайтиПовтор) Тогда
Количество.Вставить(Код, ТекКоличество);
ШхКоды.Вставить(Запрос, ТекВремя);
Результаты.ЗаписатьСтроку(Запрос);
Иначе
Ответ = Символ(7) + "Повтор кода: " + Запрос + " (" + НайтиПовтор + ")";
КонецЕсли;
Иначе
Ответ = Символ(7) + "Неверный / неизвестный код: " + Запрос;
КонецЕсли
Иначе
Ответ = Символ(7) + "Неверный код / команда: " + Запрос;
КонецЕсли;
Иначе
Попытка
ОтправитьОтвет(Ответ);
Запрос = "";
Исключение
КонецПопытки;
КонецЕсли
КонецЦикла;
Соединение.Закрыть();
ПротоколСообщить("Соединение закрыто");
КонецЦикла;
Сервер.Остановить();
ПротоколСообщить("Сервер остановлен");

КонецПроцедуры

 

Вторая версия скрипта:

Процедура ЗапуститьСервер(Порт)

Сервер = Новый TCPСервер(Порт);
Сервер.Запустить();
ПротоколСообщить("Сервер запущен на порту: " + Порт);
ПротоколСообщить("Дата инвентаризации: " + ФорматДата);

Запрос = "";
Ответ = "";
ЗапросСтрока = Неопределено;

Пока НЕ ОстановитьСервер Цикл
Соединение = Неопределено;
Пока Соединение = Неопределено Цикл
Соединение = Сервер.ОжидатьСоединения(200);
КонецЦикла;
Соединение.ТаймаутОтправки = 300;
Соединение.ТаймаутЧтения = 300;
ПротоколСообщить("Соединение установлено");
ОтправитьОтвет("Дата инвентаризации: " + ФорматДата + ПСВК);
ТекВремя = Формат(ТекущаяДата(), "ДЛФ=T");
ОтправитьОтвет(ТекВремя + " Соединение установлено" + ПСВК);
Ошибки = 0;
Пока Соединение.Активно И НЕ ОстановитьСервер И Ошибки < 5 Цикл
ОтправитьОтвет(Символы.ВК);
Если ЗапросСтрока = Неопределено Тогда
ОтправитьОтвет(">");
ПротоколСообщить(">");
КонецЕсли;
Попытка
ЗапросСтрока = "";
ЗапросСтрока = Соединение.ПрочитатьСтроку("windows-1251");
ЗапросСтрока = СтрЗаменить(ЗапросСтрока, Символы.ПС, "");
ЗапросСтрока = СтрЗаменить(ЗапросСтрока, Символы.ВК, "");
Запрос = Запрос + ЗапросСтрока;
//ЗапросСтрока = СтрЗаменить(ЗапросСтрока, "A", "");
Исключение
Если Запрос = "" Тогда
Продолжить
КонецЕсли;
КонецПопытки;
Если Запрос = "1" Тогда
ОтправитьОтвет(ПСВК);
ПоказатьРезультаты();
Запрос = "";
ЗапросСтрока = Неопределено;
Продолжить;
ИначеЕсли Запрос = "2" И ЗапросСтрока = "2" Тогда
ОтправитьОтвет(ЗапросСтрока);
ПротоколСообщить(ЗапросСтрока);
Пока СтрДлина(Запрос) < 13 И Соединение.Активно И НЕ ОстановитьСервер И Ошибки < 5 Цикл
Попытка
ЗапросСтрока = "";
ЗапросСтрока = Соединение.ПрочитатьСтроку("windows-1251");
ЗапросСтрока = СтрЗаменить(ЗапросСтрока, Символы.ПС, "");
ЗапросСтрока = СтрЗаменить(ЗапросСтрока, Символы.ВК, "");
Запрос = Запрос + ЗапросСтрока;
//ЗапросСтрока = СтрЗаменить(ЗапросСтрока, "A", "");
ОтправитьОтвет(ЗапросСтрока);
ПротоколСообщить(ЗапросСтрока);
Исключение
КонецПопытки;
КонецЦикла;
ОтправитьОтвет(ПСВК);
ИначеЕсли Запрос = "9" Тогда
ОстановитьСервер = Истина;
Прервать;
КонецЕсли;
Если Лев(Запрос, 1) = "2" Тогда
Если СтрДлина(Запрос) >= 13 Тогда
ТекВремя = Формат(ТекущаяДата(), "ДЛФ=T");
стрКод = Лев(Запрос, 13);
Код = Сред(стрКод, 2, 6);
ТекКоличество = Количество.Получить(Код);
Ответ = стрКод + " " + ПСВК;
Если НЕ ТекКоличество = Неопределено Тогда
НайтиПовтор = ШхКоды.Получить(стрКод);
Если НЕ ЗначениеЗаполнено(НайтиПовтор) Тогда
ТекКоличество = 1 + ТекКоличество;
Ответ = Ответ + " " + Номенклатура.Получить(Код) + " #" + ТекКоличество;
Количество.Вставить(Код, ТекКоличество);
ШхКоды.Вставить(стрКод, ТекВремя);
Результаты.ЗаписатьСтроку(стрКод);
Иначе
Ответ = Ответ + Символ(7) + "!Повтор кода (" + НайтиПовтор + ")";
КонецЕсли;
Иначе
Ответ = стрКод + " " + ПСВК + Символ(7) + "Неверный код / команда";
КонецЕсли;
Запрос = Сред(Запрос, 14);
ПротоколСообщить(Ответ);
ОтправитьОтвет(Ответ + ПСВК);
ЗапросСтрока = Неопределено;
Продолжить
КонецЕсли;
КонецЕсли;
Ответ = Запрос + " " + ПСВК + Символ(7) + "Неверный код / команда";
ПротоколСообщить(Ответ);
ОтправитьОтвет(Ответ + ПСВК);
Запрос = "";
ЗапросСтрока = Неопределено;
КонецЦикла;
Соединение.Закрыть();
ПротоколСообщить("Соединение закрыто");
КонецЦикла;
Сервер.Остановить();
ПротоколСообщить("Сервер остановлен");

КонецПроцедуры

Как использовать

Данный скрипт не является универсальным решением, т.к. писался под конкретную задачу. Можно взять его за основу и немного доработав, например, передавать данные напрямую в конфигурацию 1С.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *