Клавиатурный сканер

Танцы с бубном…

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

Но возникает два вопроса, первый – как определить, что работает сканер, а не пользователь мышкой нажимает кнопки? Второй связан с первым: как отследить окончания ввода данных со сканера?

Клавиатурный сканер – веселое устройство, особенно, если он дешевый, такой как Chiperlab 1000. Программы вроде 1С вообще не отличают сигналы от него и от клавиш на клавиатуре. При этом бывают чисто клавиатурные сканеры, и бывают usb-сканеров с возможностью подключения в разрыв клавиатуры. Со вторыми более-менее проще: достаточно поставить эмулятор com-порта, и за работу сканера начинает отвечать драйвер. Но чисто клавиатурный сканер такого сделать не позволяет, и для того, чтобы понять, откуда пришли данные, со сканера или с клавиатуры, и требуется бубен.

Будем исходить из того, что данные от сканера приходят пакетом, а промежуток между нажатием клавиш с клавиатуры вручную достаточно большой. Таким образом, мы можем допустить, если пользователь вводит цифры с интервалом менее 300 миллисекунд, то скорее всего он читает штрихкод сканером. Таким образом, нам достаточно отслеживать промежуток между «нажатием» кнопок на нашей форме, чтобы определить, что делает пользователь: вводит ли он данные мышьй, с клавиатуры, или пользуется сканером. Пока данные поступают с малым интервалом, будем записывать их в стек, а впоследствии обрабатывать.

 

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

Перем JScript;
…
Процедура ПриОткрытии()
Попытка
JScript = Новый COMОбъект("MSScriptControl.ScriptControl");
Исключение
JScript = Неопределено;
КонецПопытки;
Если JScript<>Неопределено Тогда
JScript.Language="JScript";
JScript.AddCode(" 
|function CurrentDate()
|{
| d = new Date()
| return d.getTime();
|}
|"
); КонецЕсли; КонецПроцедуры   Функция ПолучитьТекущееВремя(Интервал) Если JScript = Неопределено Тогда Интервал =2; Возврат ТекущаяДата(); КонецЕсли; Интервал =300; // 300 мс. паузы считаются окончание ввода и инициируют обработку стека Возврат JScript.run("CurrentDate"); КонецФункции

Теперь повесим простой обработчик нажатия кнопки с цифрами:

Перем Стек;
Перем ДлинаСтека;
Перем ВремяСтека;
…
Процедура НажатСимвол(Элемент)
Если Стек.Количество()=ДлинаСтека Тогда
Стек.Добавить(Элемент.Заголовок);
Иначе
Стек[ДлинаСтека]=Элемент.Заголовок;
КонецЕсли;
ДлинаСтека=ДлинаСтека+1;
ВремяСтека=ПолучитьТекущееВремя();
КонецПроцедуры
…
ДлинаСтека=0;
Стек=Новый Массив;
ВремяСтека=Неопределено;
 

Осталось назначить на таймер некий обработчик, который определяет, завершился ли ввод, и если завершился, обрабатывает стек.

Процедура ОбработатьСтек()
Если ДлинаСтека=0 Тогда
Возврат;
КонецЕсли;
Слово="";
Для К=0 По ДлинаСтека-1 Цикл
Слово = Слово +Стек[К];
КонецЦикла;
Если ДлинаСтека = 13 Тогда
ОбработатьВведенныйШтрихкод(Слово);
Иначе
ОбработатьВведенноеЧисло(Слово);
КонецЕсли;
КонецПроцедуры
 
Процедура ПриОжидании()
Перем Интервал;
Если ВремяСтека = Неопределено Тогда
Возврат;
КонецЕсли;
ТекВремя=ПолучитьТекущееВремя(Интервал);
Если (ТекВремя-ВремяСтека)> Интервал Тогда
ВремяСтека=Неопределено;
ОбработатьСтек();
КонецЕсли;
ПодключитьОбработчикОжидания("ПриОжидании",0.1,Истина);
КонецПроцедуры
 
Процедура ПриОткрытии()
…
ПодключитьОбработчикОжидания("ПриОжидании",0.1,Истина);
КонецПроцедуры
 

Вот и вся теория. Как видите, ничего сложного. Но бубен нам пока убирать рано, потому что на практике приведенный метод работать скорее всего не будет по весьма банальной причине: 1С просто не успевает отрабатывать поток цифр, поступающий от сканера. Решается эта проблема «замедлением» работы сканера, благо – с помощью настроечных штрихкодов можно установить его скорость. И вот тут и проявляется вся забавность клавиатурного сканера в связке с 1С: для того, чтобы 1С не проглатывало все введенные с него цифры, сканер должен работать достаточно медленно. И вряд ли вашим клиентам понравится, что штрихкод в 13 символов вводится в течение нескольких секунд. (1С версии 7.7 допускало более быструю скорость работы). И это – только первая проблема. В какой-то момент пользователи, увидев на форме кнопочки, так напоминающие дополнительную цифровую клавиатуру, захотят воспользоваться ей, и вам придется использовать не цифровые клавиши, а те, которые начинаются с Num. Это в свою очередь вновь потребует программирования сканера. Но самое неприятное даже не все это. Если на вашей форме расположена таблица значений или поле ввода, то однажды этот элемент формы может стать активным, и тогда сканер весь поток цифр направит в него…

И в результате мы приходим к простому выводу: при работе с клавиатурным сканером в 1С лучше всего использовать модальный режим и обычное поле ввода. А лучше вообще не использовать дешевые «чиперы».

Конечно, я бы мог написать этот вывод в самом начале, но тогда бы вы мне не поверили, да и статьи бы не было 🙂


39 Comments

  1. Kom-off

    Это все хорошо, только как же драйвера для сканера штрихкода от 1С, которые заявлено, что работают с клавиатурными сканерами? Как же драйвера от фирмы Атол, которые тоже работают с клавиатурными сканерами весьма достойным образом? Эти драйвера «понимают», что происходит ввод со сканера, а не с клавиатуры и генерируют внешнее событие, настраивается все в стандартной конфигурации стандартным образом.

    А вот: http://infostart.ru/public/87307/ У меня, например, на этом деле работает проект, уже долго и счастливо (еще раз спасибо автору сей компоненты). Кстати, в этой компоненте использована такая же идея определения ввода данных со сканера, как и в этой публикации (а, вот, интересно — есть ли другие идеи определить ввод с клавиатурного сканера?).

    Если статью рассматривать как «еще один способ» или «для общего развития» — я за (плюсик поставил). Если рассматривать как руководство для реальных проектов, то похоже, ИМХО, на костыль.

    Reply
  2. VallyD

    (1) Kom-off, полностью поддерживаю Ваше мнение.

    Reply
  3. LeXXeR

    Мсье знает толк в извращениях!

    Reply
  4. hogik
  5. hogik

    (0)

    P.S. к (5) сообщению.

    «лучше всего использовать модальный режим и обычное поле ввода»(с)

    Наши «умельцы» использовали CopyPaste в такое поле.

    «А лучше вообще не использовать дешевые «чиперы»»(с)

    Используем подобные 12 лет. Без проблем… 🙂

    Reply
  6. O-Planet

    (6) Наверное, с эмуляцией com или под dos =)

    Reply
  7. Антон Ширяев
    Нам потребуется аналог функции «ТекущаяДата», с точностью до миллисекунды. В 1С такой функции нет, но есть возможность использования скриптов.

    В 8.2.17 такая функция появилась — ТекущаяУниверсальнаяДатаВМиллисекундах(), поэтому бубен для 8.2.17 немного упрощается 🙂

    Reply
  8. K_A_O

    Даже у дешевых сканеров можно добавить префикс при сканировании и анализировать его

    Reply
  9. 91197ch

    познавательно

    Reply
  10. O-Planet

    (9) Очень не охота с префиксами связываться. Теряется универсальность.

    Reply
  11. Антон Ширяев

    Написал статью как обойтись без бубна в типовых — http://infostart.ru/public/177785/

    Все что нужно это настроить префикс F7 и постфикс Enter

    Reply
  12. O-Planet

    (12) Ога. Ты это кассиру предложи, всякий раз нажимать F7, вводить штрихкод, а потом жать Enter 😀 Весь смысл моей статьи — это обходиться БЕЗ лишних телодвижений: работаю с клавиатурой — вводится количество товара, например, прочитал штрихкод сканером — ищется новый товар.

    Reply
  13. Антон Ширяев

    (13)

    Так в том и дело что настроив префикс F7 сканер сам будет нажимать F7 и будет открываться окошко ввода штрихкода, а после ввода отправляется постфикс Enter — что закрывает окошко. На практике пользователь даже не успевает увидеть это окошко в большинстве случаев.

    Reply
  14. Kom-off

    (13) Насколько я понял, то

    всякий раз нажимать F7

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

    Reply
  15. O-Planet

    Я понимаю про префикс и постфикс. Но 1) хочется все-таки сканер не программировать, а использовать «как есть» 2) самое главное: а если я не стою в цифровом поле?

    Reply
  16. Антон Ширяев
    1) хочется все-таки сканер не программировать, а использовать «как есть»

    Бесспорно, каждому свое — 1С программисту не хочется заморачиваться с настройкой сканера, а тому кто не может кодить на 1С, но умеет читать инструкции проще перепрограммировать сканер.

    Да и чем меньше изменений типовой тем лучше, и многие поначалу вообще пользуются типовыми и не имеют проблем с обновлениями, другие правят типовые формочки под себя по-быстренькому в конфигураторе и потом получают лишний геморойчик при обновлении, третьи модифицируют формы программно — это дольше, но при обновлении эти формы не мешаются.

    2) самое главное: а если я не стою в цифровом поле?

    В том и прикол типовой реализации, что если фокус у Табличного поля «Товары», то и вводится в него, если фокус, например, у «Возвратной Тары», то и вводится в нее, а если фокус на поле «Орагнизация» например, то F7 не отрабатывается, но происходит ввод числа в поле Организация и можно, например, сделать шрихкоды для Организаций и будет отрабатывать ввод по строке и поиск по коду Организации в справочнике.

    Reply
  17. O-Planet

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

    Reply
  18. Антон Ширяев

    (18)

    Я как раз одно время работал с типовой Розницей 8 и в том и дело что мышка там кассиру была не обязательна.

    В рабочем месте кассира нет нескольких табличных частей, там F7 работает всегда.

    Более того, зачастую дешевый сканер не может прочитать с виду нормальный штрихкод тогда кассир нажимает F7 и вводит код с клавиатуры, опять же без мышки.

    Reply
  19. ZLENKO

    Я так и не понял почему не использовать драйвер от 1С ? Сейчас же он позволяет работать с клавиатурными сканерами. Я до сих пор по привычке пользуюсь бесплатным (старым) атолловским драйвером.

    Reply
  20. Антон Ширяев

    (20) ZLENKO.PRO,

    При правильной настройке сканера эмулирующего клавиатуру становятся не нужны никакие сторонние драйверы.

    Я до сих пор по привычке пользуюсь бесплатным (старым) атолловским драйвером.

    Тоже им пользовался на сканерах эмулирующих COM-порт, для сканеров эмулирующих клавиатуру он оказался ненужным 🙂

    Reply
  21. hogik

    (7)

    «Наверное, с эмуляцией com или под dos =)»(с)

    Нет. 🙂

    Олег.

    В (6) сообщении написан P.S. к (5) сообщению.

    В (5) сообщении ссылка на «публикацию» в разделе ЮМОР.

    В «публикации» представлен смешной способ решения проблемы без танцев с бубнами.

    Ну, очень похожий на Ваш способ. Строчек пять кода… 🙂

    Reply
  22. Spacer

    «Со вторыми более-менее проще: достаточно поставить эмулятор com-порта»

    Опять одни и те же грабли. Сколько можно изобретать велосипед и делать все через заднее место?

    Ведь есть же простое, универсальное и оптимальное решение:

    Никакой эмулятор ком-порта и нафиг не нужен.

    Берутся и ставятся обычные АТОЛ-овские дрова. И все. Никаких «танцев с бубном».

    Работает на любых, даже самых дешевых сканерах.

    Reply
  23. Spacer

    (21) Антон Ширяев, «для сканеров эмулирующих клавиатуру он оказался ненужным»

    Я бы не стал заявлять столь категорично.

    Он не нужен лишь в том случае когда есть активное поле ввода, ожидающее ввод.

    А такое бывает далеко не всегда. В моей практике было достаточно много случаев когда нет активного поля ввода, а просто должно генерироваться внешнее событие при получении данных со сканера.

    Можно конечно извращаться подобно автору данной статьи и делать какое-то замаскированное поле ввода, но в принципе это далеко не лучший вариант.

    Reply
  24. O-Planet

    (23) Нет, все ужасно умные! А мы — тупые. На самом деле, атоловские дрова были опробованы одними из первых. Не взлетело. Хотя с метролоджиками проблем нет никаких.

    Reply
  25. O-Planet

    (25) Вот именно. Посмотри описание. Chiperlab 1000 выпускается в трех вариантах: com, клавиатурный с возможностью эмуляции com и чисто клавиатурный. С первыми двумя атоловские дрова справляются, даже обычный scanopos работает, если загрузить штрихкод, говорящий что-то о совместимости. С третьим видом не прокатывает. Он работает, как клавиатура, без вариантов.

    Reply
  26. Spacer

    (24) А какая разница метроложик или нет? Значит просто что-то неправильно настроили.

    Вы фактически предлагаете делать в 1С то же самое что уже делает АТОЛ-овский драйвер.

    Reply
  27. O-Planet

    + и я замаскированное поле ввода не делал. читай внимательнее. Не важно, что мой метод делает то, что и атоловский драйвер. Почему выбрать нужно ИМЕННО атоловский драйвер, а не мой метод? Про атол могу сказать только одно: «Атол тавута чог»

    Reply
  28. Spacer

    (27) «Он работает, как клавиатура, без вариантов»

    Если у других работает, а у вас нет, то это говорит лишь о том что вы что-то неправильно настроили.

    Reply
  29. Spacer

    (28) «Не важно, что мой метод делает то, что и атоловский драйвер»

    Почему же не важно? Очень даже важно. Вот это как раз и называется «изобретать велосипед».

    Reply
  30. O-Planet

    М… Еще раз… Есть Т Р И варианта этой модели. И почему бы не изобретать велосипед? Программист так не стал бы рассуждать. Иначе мы бы не увидели Windows и 1С, а работали бы под dos-ом в dbase

    Reply
  31. Spacer

    (31) Если рассуждать так как вы, то нужно просто написать 1С самому с нуля,

    а заодно и все драйверы торг.оборудования. Всего делов то!:)

    Reply
  32. O-Planet

    (32) Разве это было бы плохо?

    Reply
  33. dimankz

    Зачем изобретать колесо???

    Есть Атоловские драйвера. Работают замечательно. Поставил и забыл. Только ставить надо драйвера 2009 года т.к. они бесплатные. Последние версии требуют ключа защиты, либо без него работают с задержкой, что бесит пользователей.

    Reply
  34. webester

    (34) Старые атоловские драйвера, криво работают с новыми сканерами, можно юзать последние драйвера от 1С(у которых при включенной русской раскладке криво читается ean128), которые умеют работать с клавиатурой. Но все равно это меньшее зло чем костыли из (0). Так же непонятно, почему автору удобно возиться со скриптами и пр дребеденью и не удобно написать код, который будет программно добавлять в 1С сканер настроенный методом как в (12).

    (12)За идею — респект! Не дошло почему то, такое простое решение.

    Reply
  35. maxx

    А зачем вообще использовать при работе с 1с клавиатурные сканерами? Дело что ли в цене? Ведь сом и USB сканов лазерные тоже metro logic (honeywell) стоят около 3000 руб а если считать стоимость работы танцев с бубном спеца то танцы невыгодные уж точно?

    Reply
  36. webester

    клавиатурный сканер (или усб в режиме ввода с клавиатуры)может быть удобен в терминале, когда клиентов со сканером, более менее приличное количество, и постоянно болит голова, под тем ли ты номером подключил компорт, не забьет ли он на сервере чей то компорт? Насчет выгодноневыгодно бывает обслуживание с фиксированной месячной ставкой и бывают фикси на окладе.

    Reply
  37. maxx

    (37) У меня торговые клиенты работающие в 1С (мы же здесь об 1С говорим) делятся на

    1) мелкие клиенты: ИП магазинчики 2-4 рабочих места со сканерами, экономить 1000 руб к примеру никто не будет если есть проведенный вариант другого подключения

    2.) супермаркета: там уже ставят POS-системы стоимостью по 70 т.руб там этой экономии вообще не видно

    Reply
  38. webester

    (28)Вы не поверите! Но бывают варианты 4,5,10,12,50 рабочих мест, маленькие, средние, большие, да тысячи их(вариантов) и то что вы про них не сном, не духом не отменяет их сушествование.

    экономить 1000 руб к примеру никто не будет

    смешно 🙂

    берем сканеры сразу штук по 10 разница между хорошим и дешевым, в районе 2тр, работают одинаково, почти… 🙂 экономия 20тр, вы прям так уверены что никто никто не будет экономить?

    Reply
  39. O-Planet

    Все, кто пишет про драйвера и что проблем нет — «тавута чог»! Мы несколько дней убили, чтобы подключить клавиатурный сканер через эмулятор. Не смогли. Помогает только вот это приведенное решение.

    Reply

Leave a Comment

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