Мобильное приложение. Пример реализации сканирования штрих кодов



Пример реализации сканирования штрих кода с помощью мобильного приложения на платформе Android и IOS.

Предисловие

Пример работы с камерой устройства как сканер штрих кодов реализован в мобильном приложении «Мобильный кладовщик lite». Это простенькая программа для складского учета.

Программа реализована на платформе 1С Предприятие 8.3.5.823 и приложение собрано на мобильной платформе версии 8.3.5.52. Программа бесплатная.

На момент написания статьи обе версии находятся в тестовом режиме и возможно функция сканирования на некоторых устройствах, может быть недоступна или работать некорректно. С уверенность могу сказать, что тестирование функционала проводилось на некоторых устройствах Philips, Samsung, Iphone 4s и Ipad. На всех аппаратах камера включалась, фокусировалась на изображении штрих кода и производила захват изображения.

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

Алгоритм реализации

Реализовал не сложный пример на основании документации встроенного языка.

1. В свойствах конфигурации в параметре «Требуемые разрешения мобильного приложения» установил «Мультимедиа». Кстати на размер собранного apk файла этот параметр не повлиял.

1. Создал общую форму, в которой будет производиться процесс заполнения документа на основании штрих кодирования.

2. Процедура формы ПриОткрытии с проверкой на поддержку устройства обработки сканирования данных. На моем китайском планшете функция проверки отработала и выдала сообщение, хотя планшет оснащен камерой.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

            #Если МобильноеПриложениеКлиент  Тогда

            Если НЕ СредстваМультимедиа.ПоддерживаетсяСканированиеШтрихКодов() Тогда

                        Сообщить(«Сканирование штрихкодов не поддерживается»);

                        Элементы.КомандаСделатьФотоШтрихкода.Доступность = Ложь;

            КонецЕсли;

            #КонецЕсли   

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

4.  Процедура команды формы связанная с элементом Кнопка. При нажатии создаем два обработчика на проверку сканирования изображения и закрытия интерфейса камеры устройства.

Оба обработчика будут параметрами встроенной процедуры для запуска интерфейса сканирования камерой устройства. Параметр тип штрих кода указал в моем случае Линейный. Возможно, указать QR или сразу оба. В случае если указать оба то возможно замедление в распознавании камерой изображения штрихкода. На тестируемых устройствах я этого не заметил.

&НаКлиенте

Процедура КомандаСделатьФотоШтрихкода(Команда)

            #Если МобильноеПриложениеКлиент  Тогда

                        ОбработчикСканирования = Новый ОписаниеОповещения(«ОбработкаСканирования», ЭтаФорма);

                        ОбработчикЗакрытия = Новый ОписаниеОповещения(«ОбработкаЗакрытияИнтерфейса», ЭтаФорма);

                        СредстваМультимедиа.ПоказатьСканированиеШтрихКодов(«Наведите камеру на штрихкод», ОбработчикСканирования, ОбработчикЗакрытия, ТипШтрихКода.Линейный);

            #КонецЕсли

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

5. Процедура обработчика сканирования изображения штрих кода. В параметр «ШтрихКод» возвращается строка обработанного кода. Обработанный код необходимо проверять на соответствие ваших данных и возвращать результат пользователю. Параметр «Результат» получит значение ИСТИНА в случае фиксирования на изображении штрихкода и его обработки. Параметр «Сообщение» возможно, задавать ваше значение которое будет отображаться на интерфейсе сканирования штрих кода после его обработки. Сообщение отображается зеленым цветом. В справке по встроенному языку указано что если неудачное сканирование то цвет сообщения будет отображаться красным цветом. Я такого результата не смог добиться.

&НаКлиенте

Процедура ОбработкаСканирования(Штрихкод, Результат, Сообщение, ДополнительныеПараметры) Экспорт

    Если Результат Тогда

              Ошибка = ЕстьОшибкаВвода(Штрихкод);

              Если Ошибка <> ЛОЖЬ Тогда

                          Сообщение = «Ошибка штрих кода»;

              Иначе

                          ОбработатьШтрихКод(Штрихкод);

                          Сообщение = ТекущаяОперация;

              КонецЕсли;

  Иначе

              Сообщение = «Ошибка обработки штрих кода»;  

  КонецЕсли; 

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

6. Процедура обработчика закрытия интерфейса сканирования в моем случае пустая.

&НаКлиенте

Процедура ОбработкаЗакрытияИнтерфейса(ДополнительныеПараметры) Экспорт

            //

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

 

Еще есть метод ЗакрытьСканированиеШтрихКодов() но я его не использовал. Позволяет программно закрыть интерфейс сканирования устройства.

 

В дальнейшем можно будет использовать Intenter для воспроизведения звукового сигнала и вибровызова в случае ошибок. Только его надо переписать под новые методы объекта «ЗапускПриложенияМобильногоУстройства»

 

Описание режима ввода документов

Небольшое описание процесса работы с режимом ввода документов. 

Первоначально произведем привязку элементов справочника «Номенклатуры» к штрих кодам. Для этого перейдем в «Объекты данных» в меню «Штрих коды».

Указываем для каждого объекта свой код.

Далее заходим в меню «Команды штрихкода» и для команд «Запись», «Отмена», и Новые документы указываем штрихкоды. Тем самым каждый штрих код будет являться командой для системы.

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

Нажав на кнопку сканирования штрих кода запускается алгоритм заполнения документа:

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

2 — Ввод данных в таблицу товаров и их количество для документа. При положительном вводе данных отображается информация о товаре. В таблице история  отображается информация о введенной команде по товару. Система принимает только коды товаров и команды «Отмена» и «Запись». Команда «Отмена» отменяет предыдущий ввод и очищает крайнюю команду из таблицы «История». Команда «Запись» — сохраняет текущий документ. После того как заполнили табличную часть документа необходимо перейти к шагу 3.

3 — Ввод данных команды «Запись». Эта команда доступна только после ввода табличной части документа.

 

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


 

 

 


26 Comments

  1. jack_kkm

    Спасибо за статью! Можете выложить исходную конфигурацию?

    Reply
  2. flyer

    на данный момент не могу выложить. она будет дорабатываться.

    Reply
  3. jack_kkm

    Автор, выручайте, пожалуйста! 🙂

    Какие у Вас версии android sdk и java skd?

    У меня платформа 8.3.5.924 и мобильная 8.3.5.52, приложение собирается без ошибок, но на телефоне пишет «ошибка синтаксического анализа» или типа того. На платформе 8.3.4 всё работало нормально, версии андроид и джава сдк не обновлял.

    Reply
  4. jack_kkm

    В мобильном приложении при считывании шк говорит «операция не разрешена», но ШК в поле появляется. Это только у меня так?

    Reply
  5. flyer

    1 собираете на новом сборщике (1.0.3.13) ?

    2 в кладовщике в регистр сведений по объектам штрихкодов укажите правильно штрихкод для номенклатуры и проверьте ее в форме Информация по штрихкоду.

    Reply
  6. jack_kkm

    (5) Собираю в новом. Установил последний jsdk и последнее API для андроид, ошибка исчезла.

    Reply
  7. kosikov_oleg

    Подскажите пожалуйста, почему картинка со сканированием ШК получается перевернутой на 90 гр. и спозиционировать на ШК не получатся -ведешь в одну сторону, картинка двигается в повернутой на 90 гр. плоскости.

    Спасибо!

    Reply
  8. flyer

    (7) kosikov_oleg, модель устройства напишите пожалуйста

    Reply
  9. kosikov_oleg

    планшет китайский Sanei N10,

    и на телефоне китайском (Jiayu G5) тоже самое

    Reply
  10. flyer

    (9) kosikov_oleg, я так понимаю 1с тестирует работу камеры на флагманах а с остальными не будет заморачиваться. с этим я не помогу

    Reply
  11. PiccaHut001

    (10) как всегда в 1С, спасибо борису

    Reply
  12. HIgor

    Спасибо за пример. Сталкивались с тем что при сканировании CODE_39 приложение просто отваливается без предупреждения. EAN_13 — отлично обрабатывает. Другие приложения обрабатывают любые типы кодов. Проблема видимо только с CODE_39, проверил на Codabar, QR, CODE_128 — работает

    Reply
  13. baza1978

    а кто нибудь сталкивался с тем что ЗакрытьСканированиеШтрихКодов() не работает? собирал приложение на API 17, пробовал в мобильной конфе, результат один. samsung galaxy s3

    Reply
  14. flyer

    (13) baza1978, странно я на разных версиях этот функционал тестировал. напишите версию платформы.

    Reply
  15. dimasikus31

    Можете выложить исходную конфу?

    Reply
  16. Nuobu

    Можете сказать, как сделать авто фокус в сканировании штрих кода?

    Платформа — 8.3.7.2008.

    Мобильная — (2.0.1.31)

    Делаю для андроида 4.4 (апи — 18).

    Reply
  17. flyer

    (16) Nuobu, в компоненту автофокус встроен. когда наводите камеру на штрихкод программа пытается считать код и видно как меняется резкость на экране. у вас так сейчас работает?

    Reply
  18. nytlenc

    На Nexus 5 не стартует, т.к. сборка не для arm-v7, похоже что под x86!

    Reply
  19. Tarlich

    а можно 1cema.xml ?

    Reply
  20. Tarlich

    не получается закрыть камеру после сканирования (еще бы звук вставить но не Сигнал() не ВоспроизвестиЗвуковоеОповещение() не пашут)

    как заставить работать ЗакрытьСканированиеШтрихКодов() ?

    Reply
  21. __kalex

    (20)

    В процедуре ОбработкаСканирования:

    #Если МобильноеПриложениеКлиент  Тогда
    СредстваМультимедиа.ЗакрытьСканированиеШтрихКодов();
    #КонецЕсли
    Reply
  22. Infector

    А у кого-нибудь есть примеры с получением штрихкода через внешнее Android-приложение. Сканер из мобильной платформы прямо скажем на троечку. Или где-то в платформе настраивается возможность обращения к другому приложению (что все-таки вызывает сомнения). Если конкретно, то интересен вот этот:

    Barcode scanner

    Reply
  23. digitta

    (22) У меня та же задача. Но пока ни чего не нашел. А вы?

    Reply
  24. Infector

    (23) Пока не раскопал, но и времени на эксперименты особо много не было.

    Нашел такой пример, но тут речь о другом, более известном приложении, но беда в том, что оно не не сильно лучше того, которое в платформу вшито. Иногда даже кажется, что это оно и есть.

    https://helpf.pro/faq/view/1801.html

    &НаКлиенте
    Процедура ЗапуститьСканированиеBarcode()
    
    #Если МобильноеПриложениеКлиент  Тогда
    
    НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие=»com.google.zxing.client.android.SCAN»;
    
    Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл
    
    Если сокрЛП(Стр.Ключ) = «SCAN_RESULT» Тогда
    Штрихкод = Стр.Значение;
    //Сообщить(Стр.Ключ+» — «+Стр.Значение);
    
    Структура = ОбщегоНазначенияСервер.ПолучитьОбъектПоШтрихКоду(ШтрихКод);
    Если Структура = Неопределено Тогда
    пТовар = Неопределено;
    Иначе
    пТовар = Структура.Номенклатура;
    
    ОткрытьЗначение(пТовар);
    
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    #КонецЕсли
    
    КонецПроцедуры  

    Показать

    https://play.google.com/store/apps/details?id=com.google.zxing.client.android

    Reply
  25. Infector

    (23)получилось со сканером zxing. Результат лучше, чем с встроенным в платформу, но специфические коды все-равно не берет (В частности GS1 — (двустрочный), причем читает отдельные его части как EAN8). Однако, если столь экзотических кодов на практике не нужно, то подойдет. процедура из примера в итоге модифицировалась к следующему:

    &НаКлиенте
    Процедура СканироватьШК_Внешнее(Команда)
    
    #Если МобильноеПриложениеКлиент  Тогда
    
    НовВз = Новый ЗапускПриложенияМобильногоУстройства(«com.google.zxing.client.android.SCAN»);
    НовВз.Запустить(Истина);
    
    КлючИЗначение = НовВз.ДополнительныеДанные.Получить(«SCAN_RESULT»);
    
    Если КлючИЗначение <> Неопределено Тогда
    Штрихкод = КлючИЗначение.Значение;
    ОбработчикШК(Штрихкод,Истина,»»,Неопределено);
    КонецЕсли;
    
    
    #КонецЕсли
    
    КонецПроцедуры
    
    

    Показать

    С приложением от Cognex Corporation к сожалению пока ничего не вышло.

    Reply
  26. digitta

    (25)

    Да, спасибо. Так лучше.

    Reply

Leave a Comment

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