Работа с промышленными сканерами штрихкодов Symbol из 1С по протоколу SNAPI через Zebra Scanner SDK

Промышленные сканеры Symbol — штука недешевая. Зато имеют надежное исполнение, абсолютно всеядные и универсальные, беспроводные, а самое интересное — имеют расширенные возможности управления через собственный протокол SNAPI (ну, есть и попроще у них сканеры, но я про самые вкусные — беспроводные и со SNAPI). Эти возможности позволяют реализовать эффективные сценарии работы.
Одна проблема — нигде не смог найти примеры для работы из 1С по этому протоколу. Все стандартные протоколы поддерживаются, но ведь смак именно в расширенных возможностях!
Поэтому пришлось копаться самому…

Насчет эффективных сценариев, простейший пример: работник склада идет со сканером в дальний шумный угол и начинает сканирование. А программа дает ему обратную связь! Т.е. если товар по каким-то причинам не проходит — можно подавать непосредственно на сканер разные звуковые и световые сигналы, сигнализирующие о характере проблемы или вообще заблокировать сканирование, чтобы работник вернулся к компьютеру и разобрался с проблемой перед продолжением сканирования. Очень удобно. Одна проблема — не смог найти готовых примеров работы из 1С.

Начал гуглить более глубоко. И (внезапно!) оказалось, что у производителя есть такая штука, как Zebra Scanner SDK. Это готовый набор (внимание!) com-компонент и примеров кода, для работы с любыми их сканерами и по любым протоколам, в том числе и по протоколу SNAPI! Просто, судя по всему, на 1С это никто не натягивал. А примеры кода и готовые демо-приложения есть на C++, C# и даже Java. Вроде как для linux тоже есть, но я в ту сторону не копал. Скорее всего там обычные библиотеки.
 
Оставался больной вопрос — не уткнется ли 1С в какие-то ограничение использования, а главное — получится ли подписаться на внешнее событие при сканировании штрих-кода. Не без проблем в процессе, но в итоге все получилось!
Рабочую обработку прикладываю за 10sm (хоть она и простейшая, но мало кому надо) и сразу извиняюсь за неприятный сюрприз — код полностью в английской нотации. Не знаю, зачем я это сделал. Смешанный язык резал глаз и хотелось глянуть, как 1С выглядит для буржуев (вполне себе нативно выглядит).
В качестве компенсации и кому дорого, просто опишу два момента, над которыми пришлось попотеть — подключение и подписка на событие. Остальное все тривиально и по документации.
 
Подключение (да-да, это код 1С):
    try
CoreScanner = new COMObject("CoreScanner.CoreScanner");
except
Message("Error driver search: " + ErrorDescription());
failure = true;
return;
endtry;

Status = -1;
ScannerTypes = new COMSafeArray("VT_I2", 1);     // array of integer(x2 byte), size=1
ScannerTypes.SetValue(0, 1);                     // 1 - all scanner types
CoreScanner.Open(0, ScannerTypes, 1, Status);
if Status <> 0 then
Message("Error scanner connection: " + Status + " " + ErrorCodes[Status]);
endif;

Подписка на событие сканирования (тоже код 1С):

    AddHandler CoreScanner.BarcodeEvent, BarCodeScanned;

Status = -1; Response = "";

CoreScanner.ExecCommand(ScannerCommands["REGISTER_FOR_EVENTS"],
StrTemplate("<inArgs><cmdArgs><arg-int>%1</arg-int><arg-int>%2</arg-int></cmdArgs></inArgs>",
1, // number of events
ScannerEvents["SUBSCRIBE_BARCODE"]),
Response, Status);

if Status <> 0 then
Message("Error subscribing to barcode scanning event: " + Status + " " + ErrorCodes[Status]);
endif;

Где ErrorCodes, ScannerEvents, ScannerCommands — это просто соответствия 1С с кодами/названиями. Нужные значения можно взять из документации Zebra Scanner SDK (ну или готовые из обработки). BarCodeScanned — это как раз название процедуры 1С (принимающей два параметра), которая будет автоматически вызываться при сканировании штрихкода. Все остальные приемы работы с библиотекой — тривиальны.

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

 

UPD

 

7 Comments

  1. pethouseua

    А сталкивались ли Вы с задачей работы со сканером по протоколу SNAPI в терминале? Как модно «пробросить» сканер в терминал?

    Reply
  2. herfis

    (1) Не сталкивался. Админы поделились сакральным знанием о том, что требуемой стабильности работы при работе через терминал им добиться не удалось (периодически были какие-то проблемы), поэтому этот вариант при мне уже не рассматривался.

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

    Reply
  3. bcosta

    Здравствуйте!

    Не передать команду воспроизведения сигнала на сканер. Делал сначала по примеру Вашего кода в статье. Заставил сканер сканировать штрихкод, с этим все просто. По аналогии и с использованием документации Zebra Scanner SDK добавил команду SET_ACTION. Но сканер молчит. В итоге скачал Вашу обработку, но Ваш код абсолютно идентичен и тоже не работает. Через приложение SDK — C++ Sample App сканер издает звук, а через 1С — нет. Сканер Zebra DS2278. Так же пытался передать прочие команды на сканер. Заработала только команда перезагрузки сканера REBOOT_SCANNER. Остальные, которые пытался, не работают. Нужен только сигнал, остальные команды не нужны. Можете что-нибудь подсказать?

    Reply
  4. herfis

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

    Сам не ожидал такого нарушения обратной совместимости для серьезного промышленного производителя. Хотя причины, в принципе, понятны. Но тем не менее. Просто теперь нужно сканер и базу получать через API как отдельные устройства и посылать им команды раздельно.

    Возможно, позже допилю обработку под этот новый ньюанс.

    ЗЫ. Пока что внес дополнение в статью. Спасибо за замечание.

    Reply
  5. herfis

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

    Reply
  6. bcosta

    (4) Спасибо. Так получилось. Получается сканирование штрихкода идет через базу, а сигнал через сканер?

    Reply
  7. herfis

    (6) У меня так. Через сканер получать сканирование даже не пробовал.

    Reply

Leave a Comment

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