Предыстория
В компанию был куплен аппарат CipherLab RS30, ТСД на базе ОС Android 4.4.2 cо встроенным сканером штрихкода. Было решено разработать приложение для работы с этим чудом техники на базе Мобильной Платформы 1С. Для примера была взята конфигурация "Мобильная Касса", в которой была уже реализована работа со штрихсканером, с помощью внешних компонент (Стандартная от 1С, вторая от компании ScanCode).
После опытов оказалось, что штрихкод считывается во внешнем окне, которое загораживает весь интерфейс, плюс для каждого считывания штрихкода нужно нажимать кнопку для вызова этого окна, что было совершенно неприемлемо. Было принято решение разработать собственную внешнюю компоненту для считывания штрихкода и передачи его в 1С, без дополнительных окон и нажатий лишних кнопок.
И тут началось, оказывается, что в Мобильном Приложение 1С нет предопределенной процедуры ВнешнееСобытие, зато есть объект "ДоставляемыеУведомления", с помощью которого можно отправить локальное сообщение и принять его с помощью обработчика уведомлений. Казалось, что вот оно, решение всех бед, но и тут мы потерпели фиаско, 1С может отправлять и принимать сообщения только от самой себя. После чего была неделя непрерывных поисков решения, информации в интернете не оказалось, а все, на что мы натыкались, говорило о том, что это невозможно.
Пришлось декомпилировать платформу, изучить весь внутренний код, но все попытки заканчивались неудачей. И вот настал день, когда надо было окончательно решить, каким способом организовать работу с этим аппаратом, и мы было уже отказались от идеи внешней компоненты и подумывали запустить всю систему через RDP, как, о чудо, после еще одной отчаянной попытки решение было найдено.
А теперь самое главное.
Ограничения: Данный способ подходит только для приложений, собранных с помощью Конфигурации "Сборщик мобильных приложений", также способ подразумевает небольшое вмешательство в исходные файлы мобильной платформы.
Дано:
1. CipherLab RS30
2. SDK для вашего сканера
3. Сборщик мобильных приложений
4. Сама мобильная платформа
5. Android Studio
А теперь начинается магия:
1. Распаковываем файлы платформы
2. Нас интересует Android\prjandroid-arm\bin\permissions.xml этот файл
Этот файл используется при сборке приложений и добавляет в AndroidManifest разрешения, которые указаны в конфигурации.
3. Нас интересует секция <LocalNotification>, которая добавляется, если установлена отметка Локальные Уведомления в требуемых разрешениях мобильного приложения. По умолчанию она выглядит так.
<LocalNotification>
<uses-permission android:name="android.permission.VIBRATE"/>
<target xpath="/manifest/application" >
<receiver
android:name="com.e1c.mobile.LocalNotificationReceiver"
android:enabled="true" >
</receiver>
</target>
</LocalNotification>
4. Здесь нас интересует секция <receiver>, com.e1c.mobile.LocalNotificationReceiver является потомком класса BroadcastReceiver, который как раз нам и нужен. Первое, что нам нужно сделать, это добавить атрибут android:exported="true" это позволит принимать сообщения из внешней программы.
5. Дальше нам нужно добавить фильтр, который будет указывать, какое событие может принять наш receiver, его-то мы и будем передавать из нашей компоненты.
<intent-filter>
<action android:name="ru.dewersia.barcodeDLL.TRUSTCONNECT" />
</intent-filter>
Теперь наша секция должна выглядеть так
<LocalNotification>
<uses-permission android:name="android.permission.VIBRATE"/>
<target xpath="/manifest/application" >
<receiver
android:name="com.e1c.mobile.LocalNotificationReceiver"
android:enabled="true" android:exported="true">
<intent-filter>
<action android:name=" ru.dewersia.barcodeDLL.TRUSTCONNECT " />
</intent-filter>
</receiver>
</target>
</LocalNotification>
6. Теперь запаковываем все обратно, наша мобильная платформа готова.
7. Дальше можно приступать и к разработке в 1С, создаем обработчик локальных уведомлений
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Вставить содержимое обработчика.
Параметр = Неопределено;
ОП = Новый ОписаниеОповещения("КрутойОбработчик",ЭтаФорма,Параметр);
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(ОП);
былЗапуск = ЛОЖЬ;
КонецПроцедуры
&НаКлиенте
Процедура КрутойОбработчик(Уведомление,Локальное,Показано,ДопПараметры) Экспорт
Сообщить(Уведомление.Текст);
ШтрихКод = Уведомление.Текст;
КонецПроцедуры
8. Отправка сообщений в Android выглядит так:
private void sendMessage(String title,String text) {
Intent intent = new Intent();
intent.setAction("ru.dewersia.barcodeDLL.TRUSTCONNECT");
intent.putExtra("text", text); //Основной текст сообщения
intent.putExtra("base", "");
intent.putExtra("title", title); //Будем использовать для определения действия
sendBroadcast(intent);
}
В параметры передаваемого сообщения добавляется значение с ключом base
intent.putExtra("base", "");
Уважаемый DitriX в одном из своих комментариев писал, что туда должен передаваться ID базы, но на все попытки передать туда какое-либо значение из всех возможных, в сообщении появлялась надпись "Сообщение для неизвестной базы", при передаче пустого значения все отлично работает.
Всем большое спасибо за внимание, надеюсь, эта информация будет кому-нибудь полезна.
В результате был написан внешний сервис, работающий в фоновом режиме, который получает штрихкод со сканера и передает его в 1С.