Управляемый Android Service перехвата сообщений Broadcast со сканера штрих-кодов в 1С (ver. 1.2.2)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. ViperGSV

    Совместимость с какими версиями Android? Интересует работа на старых версиях 2.3.х

    Reply ↓
  2. DMon

    (1) Я писал под 4.0.3. Если нужно — могу понизить версию.

    Reply ↓
  3. DMon

    (1) добавил, можно попробовать. Но работу не гарантирую, так как девайса с 2.3 нету

    Reply ↓
  4. Batman

    Небольшое замечание. Там в описании (жирным шрифтом) — опечатка — «Поддержка заКуска/»

    Reply ↓
  5. aspirator23

    (4) Автор ушел за остальным к закуске. Вернется — исправит. 🙂

    Reply ↓
  6. DMon

    (5)очень остроумно, спасибо)

    Reply ↓
  7. ASK7

    Добрый день коллеги! В поисках решения своей проблемы наткнулся на вашу статью, за что автору огромное спасибо. Я правильно понимаю, чтобы работала данная утилита НЕ НУЖНО! «потрашить, допиливать» платформу как это делал dewersia http://infostart.blog-buh.ru/public/547851. Утилита работает на типовой мобильной платформе 1с?

    Reply ↓
  8. flyer

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

    Reply ↓
  9. DMon

    (7) Привет! правильно, в платформе ничего менять не нужно. Сервис живёт сам по себе, управляется из кода 1С. А можно Вашу проблему в ЛС? Может я подобное уже решал)

    Reply ↓
  10. lion-killer

    Здравствуйте, коллеги. Можно ли подключить USB сканер к планшету на Android с помощью этого приложения. Если да, то какова последовательность действий. Объясните чайнику )))

    Reply ↓
  11. DMon

    (10) С таким не сталкивался на практике, но думаю что реально. Нужно только знать какое сообщение бродкастом рассылается от подключенного сканера. Как узнать? Да много вариантов. Самый простой — анализ logcat к примеру.

    Reply ↓
  12. lion-killer

    (11) Если переключить сканер в режим эмуляции клавиатуры — видна посылка штрих кода посимвольно (во вложении), в других режимах никаких событий нет ((

    Reply ↓
  13. LiolickGG

    Спасибо очень помогло, ТСД зажил новой жизнью.

    Reply ↓
  14. DMon

    (13) Рад за полезность 🙂

    Какое именно у Вас устройство ТСД?

    Reply ↓
  15. 1c-kt

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

    Reply ↓
  16. fr13

    Добрый день, скачал оба файла и ни один не запустился. Версия API 18. Ошибка следующего характера

    There was a problem parsing the package

    флажок на установку из неизвестных источник стоит, флажок Проверять приложения — снят. Устройство — ТСД Urovo sq42. Другие apk не из маркета ставятся без проблем

    Reply ↓
  17. fr13

    (16) проблему решил, передал apk с пк на тсд, все установилось. До этого качал апк с почты. Странное поведение ОС )

    Reply ↓
  18. DMon

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

    Reply ↓
  19. fr13

    Поделюсь своим опытом работы с опубликованным выше сервисом и ТСД Urovo sq42:

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

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

    После этого все взлетело, автору спасибо!

    Reply ↓
  20. pri_hod

    (12) Удалось отловить событие?

    Reply ↓
  21. Davidmad777

    Поделюсь своим опытом работы с опубликованным выше сервисом наТСД Newland:

    Все норм работает

    Даже на других конфигурациях пробовал

    Reply ↓
  22. Davidmad777

    Удалось отловить событие

    (20)

    Удалось отловить событие?

    да

    Reply ↓
  23. pri_hod

    (22) как ? Я уже все перепробывал…

    Reply ↓
  24. Davidmad777

    У тебя Есть Пример конфигурации с работы Acode?

    Reply ↓
  25. pri_hod

    (24) от куда скачать можно?

    Reply ↓
  26. Davidmad777
  27. Davidmad777

    Это пример Конфи там в макете есть и Acode tools apk и Примеры использования

    Reply ↓
  28. Davidmad777

    https://www.dropbox.com/s/g3161cd4xpiunve/1cema.xml?dl=0

    это xml Для Андроид Приложения

    Reply ↓
  29. pri_hod

    (28) Спасибо за конфигурацию, поставил, но так сканер и не получилось заставить работать. У меня сканер подключен к телефону через USB otg host, в блокнот сканирует без проблем, так вот заставить работать через уведомления так как в этой статье так и не получается, куда копать? как перевести «не в разрыв клавиатуры», нигде настроек нет никаких.

    Reply ↓
  30. DMon

    (29) Боюсь что никак. Для телефона он просто OTG клавиатура.

    По крайне мере мне не известны случаи успешного применения USB не в разрыв клавиатуры

    Reply ↓
  31. Davidmad777

    нзш

    Reply ↓
  32. demONx7

    (18) Дмитрий, ну что, получилось реализовать? В данный момент занимаюсь аналогичной задачей. Думаю многим будет интересно посмотреть на реализацию данного действия. Информации в интернете по этому поводу — NULL.

    Reply ↓
  33. DMon

    (32) нет, не занимался этим. Свободного времени нет пока. Да и практических задач тоже.

    Reply ↓
  34. user651504_anah0ret

    (21) А у Вас на Newland имя бродкаст сообщения какое, «scan.rcv.message»?

    Reply ↓
  35. Dream_kz

    А как узнать «ServiceBarCodeField» и «ServiceSCAN_MESSAGE»?

    Попался на руки китайский ТСД qunsuo pda401, в родное демо приложение сканирует, а сюда не хочет. Декомпилировал приложение, но не могу найти какой броадкаст он ловит.

    Reply ↓
  36. DMon

    (35) А чем декомпилировали? Может не всё разложилось?

    Выложите где-то на шару это приложение и скиньте ссылку. Я посмотрю.

    Reply ↓
  37. Dream_kz

    (36)Да вроде все. В манифесте посмотрел интент фильтр, попробовал по нему, и по другим событиям, но мне кажется я не то поле указал, в котором лежит штрихкод.

    Здесь и само приложение, и исходники к нему (нашел на сайте производителя)

    http://dropmefiles.com/JGlaf

    Попробовал события:

    ismart.intent.scandown

    com.qs.scancode

    com.zkc.scancode

    с полем code, и barocode

    Но безрезультатно.

    Reply ↓
  38. as.kharlov

    У меня ТСД Motorola Symbol MC3200. Сканер штрихкода в разрыв клавиатуры. Acode не взлетели. Эта утилита может работать?

    И как узнать какой бродкаст прописывать для моей модели? Гугл в ответе не помог.

    Спасибо!

    Reply ↓
  39. as.kharlov

    Прошу прощения, не заметил сразу сообщения про logcat. Завтра попробую

    Reply ↓
  40. nkroshko

    Спасибо за программу! Удалось установить взаимодействие с 1С на ТСД Атол Smart Droid.

    заработало с такими установками:

    ServiceSCAN_MESSAGE = DATA_SCAN

    что странно независимо от того, что указываешь в ServiceBarCodeField все равно вызывает событие в 1С 🙂

    Reply ↓
  41. /// ANTONIO
    Reply ↓
  42. as.kharlov

    Dmitry Po.

    Вопрос:

    Пользуюсь ТСД Motorola Symbol MC9200

    Настроил при сканировании штрих-кода отсылать его как эммуляцию ввода с клавиатуры и broadcast intent

    подключил adb. Смотрю logcat чтоб понять какой бродкаст ловить. Вот изменения logcatа после сканирования штрихкода:

    W/SoundPool(  730):   sample -1 not READY
    E/ImagerAdapter(  730): Guard passed
    E/NotificationService(  454): Not posting notification with icon==0: Notificatio
    n(pri=0 contentView=com.symbol.datawedge/0x1090064 vibrate=null sound=null defau
    lts=0x0 flags=0x11 kind=[null])
    E/NotificationService(  454): WARNING: In a future release this will crash the a
    pp: com.symbol.datawedge
    E/TIAdapter(  730): ID-VIDIOC_SIZEDQBUF Acquistion Stopped mMaxFrameSkip = 0
    D/dalvikvm(  730): GC_CONCURRENT freed 914K, 17% free 5774K/6884K, paused 6ms+5m
    s, total 54ms
    D/InputMethodService(  587): Params passed to SoftKeyboard android.util.MapColle
    ctions$KeySet@bc86db18
    D/InputMethodService(  587): keystroke_action_char -1
    D/InputMethodService(  587): ime_output_enabled true
    D/InputMethodService(  587): running Injector
    D/InputMethodService(  587): Injector: doInject
    E/NotificationService(  454): Not posting notification with icon==0: Notificatio
    n(pri=0 contentView=com.symbol.datawedge/0x1090064 vibrate=null sound=null defau
    lts=0x0 flags=0x11 kind=[null])
    E/NotificationService(  454): WARNING: In a future release this will crash the a
    pp: com.symbol.datawedge
    I/wpa_supplicant(  572): signalpoll buffer: RSSI=-47
    I/wpa_supplicant(  572): LINKSPEED=65
    I/wpa_supplicant(  572): NOISE=-71
    I/wpa_supplicant(  572): FREQUENCY=5220
    E/NotificationService(  454): Not posting notification with icon==0: Notificatio
    n(pri=0 contentView=com.symbol.datawedge/0x1090064 vibrate=null sound=null defau
    lts=0x0 flags=0x11 kind=[null])
    E/NotificationService(  454): WARNING: In a future release this will crash the a
    pp: com.symbol.datawedge
    I/wpa_supplicant(  572): signalpoll buffer: RSSI=-46
    I/wpa_supplicant(  572): LINKSPEED=65
    I/wpa_supplicant(  572): NOISE=-70
    I/wpa_supplicant(  572): FREQUENCY=5220

    Показать

    Отсканированный штрихкод 120717109704 (EAN13)

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

    Подскажите куда копать? Как определить имя бродкаста?

    Заранее большое спасибо!

    Reply ↓
  43. DMon

    (42) Это блютуз сканер? «com.hht.emdk.datawedge.data_string» не подходит?

    Есть ли утилита внутренняя для настройки сканера? Я обычно разбираю её чтоб глянуть.

    Reply ↓
  44. as.kharlov

    (43) Dmitry Po,

    Спасибо за ответ!

    сканер встроенный в терминал сбора данных

    В настройках есть «Scanner selection». В этом меню есть пункт «Bluetooth Scanner disconnected». Если выбрать его, то при запуске 1С ругается что блютуз сканер не подключен.

    у меня выбран пункт «Scanner selection» = «Auto (2D Barcode Imager)».

    Из моего ответа можно понять блютуз сканер или нет?

    прописал бродкаст «com.hht.emdk.datawedge.data_string»

    ОбработкаОповещения не возникла.

    Внутренняя утилита для настройки сканера есть. Называется DataWedge. В ней редактирую профили сканирования. Об этой утилите Вы спрашивали? Как ее можно разобрать?

    Кстати, база 1с у меня не скомпилированный apk, а запускается как конфигурация из мобильной платформы, установленной на терминале. Это может влиять на результат?

    Конфигурация у меня одна поэтому в параметре «ServiceBase_Name» оставил «».

    Reply ↓
  45. as.kharlov

    Dmitry Po,

    И еще:

    НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»barocode»)

    у Вас написано: //в каком поле сканер возвращает штрих-код (если не задавать — по умолчанию barocode, что в большинстве случаев оно так)

    «в большинстве случаев так, а в моем конкретном случае это не может отличаться?

    Reply ↓
  46. Dimitrij

    (26) Добрый день,

    Не сталкивались с проблемой что при установки приложения на ТСД выскакивает «Cannot call synchronous methods on the client»?

    Заранее спасибо!

    Reply ↓
  47. andrey314

    Блютуз сканер Zebra DS6878-SR будет работать? В режиме HID ?

    Reply ↓
  48. DMon

    (47) Если есть в устройстве утилита от сканера, которая генерит бродкас сообщения — теоретически возможно. На практике таким не занимался.

    Reply ↓
  49. andrey314

    Подскажите, вы какие-нибудь другие блютус сканеры подключали? И в каком режиме?

    Reply ↓
  50. DMon

    (49) Внизу публикации указано что добавлено в версию 1.1. Делал это вспелую для коллеги по инфостарту. По его словам всё заработало. Сканер должен быть НЕ в разрыв клавиатуры.

    Reply ↓
  51. andrey314

    (22) Присоединяюсь к вопросу

    Reply ↓
  52. Lupeykin

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

    Reply ↓
  53. DMon

    (52) и Вы думаете, что у всех кто скачал тоже нет внешнего события?… и даже те, кто выражал благодарность в комментариях — фейковые? А может нужно причину поискать у Вас на стороне, а не сразу жалеть потраченные копейки? И автор не обязан выкладывать исходники для утилиты за 1 стармани в статусе «как есть». Не нравится — сделайте свою и лучше, выложите на Инфостарт и вернете «зря потраченные деньги»! Хорошего дня!

    Reply ↓
  54. user847620

    Добрый день!

    Подскажите, пожалуйста, какое значение нужно задавать для ServiceSCAN_MESSAGE? Пробовал те, что указаны в настройках сканера (на фото), уведомление в 1с не приходит. Logcat тоже прикрепил. Нажатие кнопки сканера в строках 10117-10229 (первые строки тоже оставил, вдруг там какая-то нужная информация). Сканер DataLogic DL-Axist.

    Reply ↓
  55. andrey314

    Подскажите по ПолучитьИДБазы(). Если например у меня в мобильном приложении несколько баз? Что я должен сюда передавать?

    Reply ↓
  56. DMon

    (56)

    Не помню уже где это нашел, но писали очень хорошие люди, им спасибо!

    Я получаю и записываю значение в константу.

    На форме с константой, в НачалоВыбора пишем:

    &НаКлиенте
    Процедура ИдентификаторБазыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    #Если МобильноеПриложениеКлиент Тогда
    СЗ = Новый СписокЗначений;
    
    Базы = Новый ЧтениеТекста («/data/data/com.e1c.mobile/files/1C/1cem/ibases.v8i»);
    Стр = Базы.ПрочитатьСтроку();
    _Имя = «»; _ИД = «»;
    Пока Стр <> Неопределено Цикл
    Если Лев(Стр, 1) = «[» Тогда
    _Имя = Стр;
    КонецЕсли;
    Если Лев(Стр, 3) = «ID=» Тогда
    _ИД = СтрЗаменить(Стр,»ID=»,»»);
    СЗ.Добавить(_ИД,_Имя);
    КонецЕсли;
    Стр = Базы.ПрочитатьСтроку();
    КонецЦикла;
    
    Эл = СЗ.ВыбратьЭлемент();
    НаборКонстант.ИдентификаторБазы = Эл.Значение;
    
    #КонецЕсли
    КонецПроцедуры
    
    

    Показать

    Reply ↓
  57. andrey314

    (57) Спасибо. Понял.

    Reply ↓
  58. gorevg

    А кто-нибудь на АТОЛ Smart.Droid смог запустить? Уже несколько дней вожусь. Функция ЗапуститьКомпонентуСканирования отрабатывает. Ошибок нет. Результат =77. Сканер пищит, что отсканировал, но до 1с не доходит…

    Reply ↓
  59. DMon

    (59)

    У формы

    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = «1» И ВводДоступен() И НЕ флВводСН Тогда
    ПолученШтрихКод(Параметр);
    КонецЕсли;
    КонецПроцедуры
    
    

    Показать

    что-то подобное прописано?

    И ПриНачалеРаботыСистемы всё ли правильно описано?

    проверьте ещё раз

    Reply ↓
  60. gorevg

    (40)

    Спасибо!

    Заработало.

    Вот так нужно сделать:

    НовЗП.ДополнительныеДанные.Добавить(«ServiceSCAN_MESSAGE»,»DATA_SCAN»);

    Reply ↓
  61. Igel

    День добрый.

    Кто может подсказать, а какой Broadcast ServiceSCAN_MESSAGE у ТСД CipherLab RS30 / RS50?

    Reply ↓
  62. DMon

    (62) Есть встроенная утилита для управления сканером?

    Если да — то в ней должно быть какое-то поле для тестирования что сканер работает.

    Если да — то эта утилита является слушателем бродкаста и соответственно в ней прописано какой именно слушается.

    Остается только достать эту утилиту с устройства (apk-файл), разобрать его и посмотреть.

    З.Ы. Как разобрать — это уже другая тема.

    Reply ↓
  63. Igel

    Спасибо. Поизучаем

    Reply ↓
  64. VladimirMelnychenko

    (63)

    утилиту

    Добрый день.

    Подскажите пожалуйста, как можно определить параметры «ServiceSCAN_MESSAGE» И «scan.rcv.message».

    Разобрал apk родной утилиты (http://dropmefiles.com/gnrhx) не могу разобраться что именно искать.

    Терминал SunLux XL-868.

    Reply ↓
  65. evgeny43

    Добрый вечер коллеги .

    Скачал данное ПО .

    Возникло несколько вопросов :

    1) мобильное приложение в апк файл конвертировать не обязательно?

    2)ни кто не знает какой бродкаст и поле со штрих кодом у Honeywell ScanPal EDA50K ?

    Reply ↓
  66. evgeny43

    (66) хотя с 1 вопросом чет не подумал, отпадает, в противном случае нафиг идентификатор базы)

    Reply ↓
  67. evgeny43
    Reply ↓
  68. evgeny43

    (68) (66) наконец разобрался, что к чему , поле с байтовым значением кода «dataBytes» , а интент в данном случае, я задаю сам в настройках сканера,

    и я указал scan.rcv.message, т.о сканер перестал сканировать в разрыв клавиатура и посылает сообщение по данному интенту , однако ПО по какой-то причине не перехватывает его.

     НовЗП = Новый ЗапускПриложенияМобильногоУстройства();
    НовЗП.Действие = «com.barcodeto1c.action»;
    НовЗП.ДополнительныеДанные.Добавить(«ServiceState»,»Start»); //что сделать: Старт/Стоп
    НовЗП.ДополнительныеДанные.Добавить(«ServiceSCAN_MESSAGE»,»scan.rcv.message»); //чей бродкаст ловить
    НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»dataBytes»); //в каком поле сканер возвращает штрих-код (если не задавать — по умолчанию barocode, что в большинстве случаев оно так)
    НовЗП.ДополнительныеДанные.Добавить(«ServiceEventID»,»1″); //категория сообщение для 1С
    НовЗП.ДополнительныеДанные.Добавить(«ServiceToast»,»Service STARTED!»);//(не обязательно) просто покажет Тост при успехе
    НовЗП.ДополнительныеДанные.Добавить(«ServiceBase_Name»,»»);//если одна база — можно поставить «»
    Результат = НовЗП.Запустить(Истина);
    
    Если НЕ Результат = 77 Тогда
    //тут можно отловить что что-то не так. Возможно апк не установлена или что-то не сработало
    КонецЕсли;

    Показать

    в чем может быть дело?

    Версия мобильной платформы 8.3.9.74 —— программа запускается через типовую мобильной платформу 1с(т.е не apk файл) .

    Reply ↓
  69. evgeny43

    Вопрос решился. данная модель , хотя и передает байтовое поле «dataBytes», но по какой то причине оно не преобразует его в строку для отправки в 1с.

    Решался вопрос следующим образом: обработка была переписана на прием поле data в котором передается уже строковое представление штрих кода.

    Для работы сканера данного устройства необходимы следующие настройки:

    Меню Настройки->scanning->Internal Scanner-> тут либо в «default profile» делаете настройки, либо создаете новый профиль для 1с -> data processing settings-> тут нас интересуют следующие поля:

    1)Scan to intent ставим галочку

    2)Data intent ставим галочку , и проваливаемся в настройки данного поля.

    настройки Data intent :

    Action(поле отвечающие за наименование интента которое отправит сканер ) — тут я прописал scan.rcv.message .

    остальные поля я не заполнял.

    если кому интересно в коде андроид приложения я замел следующую строку :

    public void onReceive(Context context, Intent intent) {

    byte[] barcode = intent.getByteArrayExtra(«barocode»);———>String barcode=intent.getStringExtra(«data»);

    int lng = intent.getIntExtra(«length», 0);

    this.barcodeStr = new String(barcode, 0, lng);——> this.barcodeStr =barcode;

    if (lng > 0) { /// данное условие в принципе должно работать, но у себя я его убрал, т.к сканер либо передает данные если считал все хорошо, либо нет.

    Intent intentFor1C = new Intent(«com.google.android.c2dm.intent.RECEIVE»);

    intentFor1C.putExtra(«text», BCService.EventID);

    intentFor1C.putExtra(«title», «1C»);

    intentFor1C.putExtra(«data», this.barcodeStr);

    if (BCService.BaseName != null || BCService.BaseName != «») {

    intentFor1C.putExtra(«base», BCService.BaseName);

    }

    context.sendBroadcast(intentFor1C);

    }

    }

    Reply ↓
  70. Just_J

    Добрый день.

    При запуске приложения перехвата из 1С оно возвращает 0, не подскажите что означает код возврата 0?

    Reply ↓
  71. DMon

    (71) Значит не запустилось. Проверьте правильность запуска.

    Корректный старт делает выход по инструкции

    setResult(77);

    иначе — всё что угодно, но не 77

    Reply ↓
  72. Just_J

    (72) Это может быть связано с неправильными передаваемыми параметрами в сервис? или же это проблема моего устройства?

    Reply ↓
  73. DMon

    (73) Напишите как вы передаете параметры, какое устройство, версия Android?

    Поподробнее пожалуйста)

    Reply ↓
  74. Just_J

    (74)ТСД:

    zebra tc700h

    android 4.4.3

    На устройстве есть предустановленное приложение datawedge в нем можно настроить имя и категорию интента.

    1С мобильная платформа 8.3.11.57.

    Запускаю ваше приложение кодом взятым из этой темы. При запуске без ИД базы т.е. параметр ServiceBase_Name = «» приложение возвращает 0, если же указать ИД базы то оно запускается возвращает 77, но сообщения сканера не ловит.

    Reply ↓
  75. evgeny43
    Reply ↓
  76. evgeny43
    &НаКлиенте
    Функция  ИдентификаторБазыНачалоВыбора()
    
    СтандартнаяОбработка = Ложь;
    
    #Если МобильноеПриложениеКлиент Тогда
    СЗ = Новый СписокЗначений;
    
    Базы = Новый ЧтениеТекста («/data/data/com.e1c.mobile/files/1C/1cem/ibases.v8i»);
    Стр = Базы.ПрочитатьСтроку();
    _Имя = «»; _ИД = «»;
    Пока Стр <> Неопределено Цикл
    Если Лев(Стр, 1) = «[» Тогда
    _Имя = Стр;
    КонецЕсли;
    Если Лев(Стр, 3) = «ID=» Тогда
    _ИД = СтрЗаменить(Стр,»ID=»,»»);
    СЗ.Добавить(_ИД,_Имя);
    КонецЕсли;
    Стр = Базы.ПрочитатьСтроку();
    КонецЦикла;
    Эл = СЗ.ВыбратьЭлемент();
    Возврат Эл.Значение;
    
    #КонецЕсли
    КонецФункции 

    Показать

    это уже было описанно в данной теме Dmitry Po (DMon) ( за что ему спасибо)

    Reply ↓
  77. Shef_zeon

    Подскажите что делать если сканер возвращает

    (String)intent.getStringExtra(«EXTRA_BARCODE_DECODED_DATA»)

    Reply ↓
  78. DMon

    (78) по идее это будет ServiceBarCodeField

    НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»EXTRA_BARCODE_DECODED_DATA»); //в каком поле сканер возвращает штрих-код

    Reply ↓
  79. evgeny43

    (78)

    попробуй мою обработку

    это у мобил байза такой интент и у хоновела похожий маунал, однако в итоге оказалось, что сам интент настраивается в настройках , а поле которое возвращается data типа srting

    собери всю информацию что я писал выше и попробуй, или просто попробуй установить обработку в комментариях мою

    Reply ↓
  80. Shef_zeon

    Спасибо

    получилась такая модификация

    if (BCService.TypeBarCodeField.equalsIgnoreCase(«string»))

    {

    barcodeStr=paramIntent.getStringExtra(BCService.BarCodeField);

    //»EXTRA_BARCODE_DECODED_DATA»

    lng = paramIntent.getIntExtra(«EXTRA_BARCODE_DECODED_SYMBOLE», -1)+1; }

    else

    {

    byte[] barcode = paramIntent.getByteArrayExtra(BCService.BarCodeField);

    lng = paramIntent.getIntExtra(«length», 0);

    barcodeStr = new String(barcode, 0, lng);

    }

    Reply ↓
  81. ludmirsky

    Дмитрий,

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

    Вот в документации от Zebra написано о параметрах в Intent: http://techdocs.zebra.com/datawedge/6-2/guide/setup/#decoderelateddata

    Можно ли что-то сделать, чтобы сервис заработал?

    Пробовали:

    НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»data_string»);

    и

    НовЗП.ДополнительныеДанные.Добавить(«ServiceBarCodeField»,»com.symbol.datawedge.data_string»);

    Reply ↓
  82. Rokstedi

    Добрый день коллеги. Подскажите, все таки сканер должен работать в режиме эмуляции клавиатуры или в режиме эмуляции COM?

    Reply ↓
  83. DMon

    (83) в режиме эмуляции COM

    Reply ↓
  84. Rokstedi

    (84)Сканер symbol ls2208. Подключаю к планшету через usb otg переходник. Сканер настроен в режиме cdc. Logcat молчит как партизан. Что делать?

    Reply ↓
  85. DMon

    (85) Сложно сказать не имея оборудование под рукой. Компонента для ТСД, а не внешних сканеров.

    Надо только экспериментировать.

    Reply ↓
  86. s.neumyvakin_2015

    (70) Добрый день!

    Нам тоже привезли ТСД Honeywell. Не могли бы вы прислать переделанное андроид приложение?

    Reply ↓
  87. evgeny43

    (98) Добрый вечер. оно есть в этой теме в 76 сообщении

    Reply ↓
  88. Lupeykin

    8.3.10.51 это работало

    на 8.3.12.67 больше не прокатывает

    Intent intentFor1C = new Intent(«com.google.android.c2dm.intent.RECEIVE»);

    intentFor1C.putExtra(«text», BCService.EventID);

    intentFor1C.putExtra(«title», «1C»);

    intentFor1C.putExtra(«data», this.barcodeStr);

    изминили манифест разработчики, 1с, непонятно теперь как отдать платформе ШК

    Reply ↓
  89. hobi

    (76)

    Добрый день.

    При запуске компоненты сканирования (BarcodeAndroid_1.3.apk)

    отображается картинка с роботом и заголовком «BarcodeAndroid»

    Как её убрать ?

    Reply ↓
  90. evgeny43

    (107)

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

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

    Reply ↓
  91. hobi

    (108)

    Да, на работу не влияет.

    Только на нервы действует )

    Reply ↓
  92. evgeny43

    (109)

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

    Reply ↓
  93. user667563_kostix911

    (63)А можно по подробнее об этой теме, есть какой то мануал?

    Reply ↓
  94. DMon

    (118) У гугла спросить как разобрать apk )

    Reply ↓
  95. user667563_kostix911

    (119)APK то разобрал, но как определить ServiceSCAN_MESSAGE в исходных файлах? Смотрел манифест, думал брать имя receiver . Но так и не получилось.

    Reply ↓
  96. arcadics

    (70)

    dataBytes

    что если перебрать поля вот этим кодом:

    Bundle extras = intent.getExtras();

    Set<String> ks = extras.keySet();

    Iterator<String> iterator = ks.iterator();

    while (iterator.hasNext()) {

    Log.d(«MyActivity», iterator.next());

    }

    у меня результат:

    dataBytes — > необходимый массив

    data —> штрих код в String

    timestamp

    aimId

    version

    charset

    scanner

    int lng = intent.getIntExtra(«length», 0); //работать не будет т.к. поля нет

    использовать int barocodelen = barocode.length;

    если вычислить имя массива dataBytes останиться только указать в настройках имя интента «scan.rcv.message» и должно работать на всех ТСД

    Reply ↓
  97. evgeny43

    (121)

    dataBytes

    Спасибо, полезная информация, когда то до этого сам доходил, но уже забыл.

    Как раз собирался вспомнить как получить все поля интента )

    Reply ↓
  98. Nrk

    (110)а подскажите по каким источникам изучали андроид программирование?))

    Reply ↓
  99. evgeny43

    (186)

    (110)а подскажите по каким источникам изучали андроид программирование?))

    ютуб-Старт андроид + база университета по java минимальная ))) , а дальше под конкретную задачу гугл в помощь)

    Reply ↓

Leave a Comment

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