Каталог решений - “Заставим сканер пищать!” или Получаем обратную связь из 1С при сканировании штрихкодов

“Заставим сканер пищать!” или Получаем обратную связь из 1С при сканировании штрихкодов

“Заставим сканер пищать!” или Получаем обратную связь из 1С при сканировании штрихкодов

В наличии

Получаем обратную связь из 1С при сканировании штрихкодов.

Категория:

Описание

Лирическое вступление

Представьте, что вы находитесь внутри большого склада и держите в руках беспроводной сканер штрихкодов. Вам нужно отсканировать в документ несколько товаров, стеллаж с которыми находится в 20-ти метрах от компьютера. У вас хороший сканер, который без проблем работает на таком расстоянии. Вы подходите к стеллажу и сканируете первый товар. Сканер пикает, и вы уверенно откладываете товар, чтобы отсканировать следующий. Но в последний момент вы замечаете, что у товара есть еще один штрихкод. Возможно это штрихкод производителя, или наклейка компании-перевозчика, которая есть на каждой посылке. Как понять, что вы отсканировали нужный штрихкод? Вы возвращаетесь к компьютеру и проверяете, добавился ли товар в табличную часть. Окей, товар есть. 

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

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

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

– Штрихкод отсканирован правильно
– Штрихкод дошел до 1С
– По штрихкоду успешно найден товар и добавлен в документ.

Это понимают и кладовщики. Поэтому в процессе сканирования участвуют минимум два человека и выглядит это так:

<Пик>
– Есть!
<Пик>
– Есть!
<Пик>
– Не прошло, давай еще раз!
<Пик>
– Есть!

Наблюдая этот процесс со стороны, я понял, что нужно что-то менять.
 

Используем колонки

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

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

Попробуем подойти к решению проблемы с другой стороны. У нас в руках есть устройство, которое пищит при каждом сканировании, и его отлично слышно в любой ситуации. Так почему бы для уведомления об успешном сканировании не использовать сам сканер?
 

Используем динамик сканера

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

Так сложилось, что у меня была возможность провести тест на разных моделях сканеров. Поэтому кроме экспериментов, я буду делиться впечатлениями о самом устройстве.

 

CipherLab 1560

Неплохой сканер из Тайваня. Несколько дороже своих аналогов, но оправдывает цену большой дальностью сканирования (производитель заявляет до 90 м). Отмечу, что в реальных условиях с учетом преград на пути сигнала (товары, стеллажи) держит связь стабильно на расстоянии как минимум 50 м. К слову, пользуемся им 3 года в тяжелых условиях на складах, где холодно и высокая влажность, нареканий нет. Из недостатков – не умеет сканировать с телефона. В улучшенной модели 1560p это исправили, а также еще увеличили дальность сканирования.

Я решил начать с обращения к производителю. В России есть официальный представитель CipherLab https://scancode.ru/, на сайте есть форум. Задаю вопрос:

Получаю ответ в том же стиле, что и в остальных местах, еще и намекнули на мою безграмотность. 🙂 Придется изучить вопрос самостоятельно. 

Читая многостраничный мануал к сканеру, особый интерес вызвал раздел “Время ответа ACK/NAK”: 

По умолчанию, сканер посылает данные в ПК, без ожидания ответа ACK/NAK, перед отправкой следующей порции данных. Установите требуемое значение задержки в диапазоне 1-99, которое изменяется с шагом в 0.1 сек. Если нет ответа, в пределах указанного периода, — сканер будет пытаться отправить те же данные еще — 3 раза. Если все попытки окончились неудачей без любого уведомления, — данные будут окончательно потеряны.

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

Как же отправить на сканер ответ? Для начала разберемся, как в принципе можно отправлять команды на устройство. Большинство сканеров умеет работать как минимум в двух режимах – эмуляции клавиатуры и эмуляции COM порта. Первый режим самый простой и понятный. При подключении сканер определяется как usb клавиатура, и штрихкоды приходят обычным текстом. Можно открыть блокнот и отсканировать штрихкод, вы его сразу увидите.

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

Тем не менее COM порт предназначен не только для считывания, но и для записи данных. И всё, что записано в порт, будет отправляться на сканер. Поэтому прежде чем начинать эксперименты, убедитесь, что сканер поддерживает режим эмуляции COM порта и подключен к ПК в этом режиме.

Как отправить данные в COM порт? Очень просто – достаточно записать файл по адресу “\\.\ComX”, где Х – номер порта, и всё содержимое файла будет отправлено в порт. Номер порта можно узнать в диспетчере устройств в разделе “Порты (COM и LPT)”. Например, следующий код отправит команду “Hello!” на сканер:

ЗаписьТекста = Новый ЗаписьТекста("\\.\Com10", КодировкаТекста.ANSI, "");
ЗаписьТекста.ЗаписатьСтроку("Hello!");
ЗаписьТекста.Закрыть();

С отправкой команд разобрались, вернемся к мануалу. Нас особо интересует следующая строчка: “сканер посылает данные в ПК, без ожидания ответа ACK/NAK”. Что такое ACK/NAK? Я полностью просмотрел руководство, но нигде не нашел, что эти команды представляют. Снова написал в Сканкод, причем в этот раз еще и в украинское представительство, но результат предсказуем. 🙂 И там и там меня вежливо послали, ограничиваясь общими фразами, что ничего контролировать не получится, всё завязано на прошивке и тп. Так что выводы о грамотности официальной техподдержки CipherLab делайте сами. UPD: уже после того, как я нашел способ отправлять ответ на сканер (рассказано ниже), мне еще раз написало украинское представительство. Как оказалось, они переслали мой вопрос в Тайвань и получили ответ. Так что не всё так плохо.

В результате гугления и экспериментов я узнал, что ACK и NAK – это Unicode символы, которые используются при взаимодействии с различным оборудованием.  При успешной обработке команды отправляется символ ACK, в противном случае отправляется NAK. То есть это обычные непечатаемые символы, которые которые можно получить при помощи стандартной функции Символ(). у ACK номер символа 6, у NAK – 21. Таким образом, чтобы отправить ответ сканеру что данные получены, достаточно выполнить следующий код:

ЗаписьТекста = Новый ЗаписьТекста("\\.\Com10", КодировкаТекста.ANSI, "");
ЗаписьТекста.ЗаписатьСтроку(Символ(6)); // ACK
ЗаписьТекста.Закрыть();

И это работает! После получения ACK, сканер не отправляет данные повторно и не сообщает об ошибке. Следовательно, если штрихкод найден, мы отправляем на сканер команду ACK; если не найден, не отправляем ничего (так как если отправить NAK, сканер продолжит отправлять данные, пока не получит ACK).

Но есть нюанс. В режиме ACK/NAK можно настраивать время ожидания ответа, но нельзя настроить количество попыток повторной отправки штрихкода – оно фиксировано и всегда равно трем. Допустим, время ожидания составляет 5 секунд. Для файловой базы этого хватит с головой. Но при работе через интернет могут быть задержки. Поэтому возможна ситуация, когда сканер, не дождавшись ответа от 1С, отправит данные еще раз. Конечно можно увеличить время ожидания хоть до 30 секунд (тут уж сама 1С отвалится по таймауту), но если штрихкод не будет найден, пользователю придется ждать целых полторы минуты, пока сканер не сообщит об ошибке.

Нужен какой-то другой способ сообщить сканеру о том, что штрихкод не найден и нет смысла ждать ответа от ПК. Возвращаемся к мануалу. В самом конце, в Приложении к руководству, нашелся интересный раздел с заголовком “Управление с ПК серийными командами”. Используя команды, можно включать/выключать сканер, конфигурировать его, издавать сигнал и даже дистанционно включать/выключать луч сканирования (еще раз передаю привет техподдержке CipherLab). Я не буду перечислять все команды, остановлюсь только на одной – “Продолжение операции”. Если отправить эту команду, сканер издаст длинный сигнал, выйдет из режима ожидания и будет готов к следующему сканированию. К статье приложена обработка, в которой есть примеры команд.

 

Таким образом, для настройки обратной связи со сканером:

  1. Выставляем максимальное время ожидания ответа ACK/NAK
  2. Если штрихкод найден, отправляем АСК
  3. Если штрихкод не найден, отправляем серийную команду “Продолжение операции”

Вот как это работает:

has been added to your cart:
Оформление заказа