Управляемый 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 // Полная загрузка сервисных книжек, создан 2024-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 не будет опубликован. Обязательные поля помечены *