Работа с промышленными сканерами штрихкодов 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 не будет опубликован. Обязательные поля помечены *