1С и Java: GetData - возврат имени из Activity в форму мобильного клиента
Разработка - Мобильная разработка
Мобильная платформа 1С:Предприятие 8.3 позволяет вызывать сторонние Андроид-приложения через объект ЗапускПриложенияМобильногоУстройства. В первой части цикла мы разбирали односторонний запуск: action showtime и showdate без возврата данных. Во второй части замыкаем контур - пользователь вводит текст во внешнем Activity на Java, а строка попадает обратно в реквизит формы 1С. Ключевые механизмы Android: явный Intent по action, startActivityForResult, setResult с extra и обработчик onActivityResult. На стороне 1С - асинхронный НачатьЗапускПриложенияМобильногоУстройства и процедура оповещения, которая читает extra с ключом name.
1. Зачем возвращать данные из Java в 1С
Дерево Андроид-проекта: layout, Activity и манифест GetData
Сомранион-приложение на Java часто удобнее для доступа к камере, сканеру штрихкодов, NFC или сложной нативной логике. Если результат нужен в конфигурации 1С, рисовать второй экран внутри мобильного клиента необязательно: достаточно одного Activity с полем ввода и согласованного контракта extra. Демо action ru.w0rm.intent.action.GetData - учебный, но шаблон переносится на любые строковые или сериализованные данные.
Границы материала: Android с установленным APK, мобильный клиент 1С с директивой #Если МобильноеПриложениеКлиент. НТТР-сервисы, публикация в магазинах и корпоративный MDM здесь не рассматриваются.
2. NameActivity: layout и setResult
Intent с результатом: запуск GetData и extra name в ответе
Создаём Activity с разметкой name.xml: EditText для имени и кнопка OK. По нажатию OK формируем Интент-ответ, кладём строку в extra name, вызываем setResult(RESULT_OK, intent) и finish(). Без второго аргумента setResult вызывающая сторона получит data == null даже при RESULT_OK.
public class NameActivity extends AppCompatActivity {
private EditText etName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.name);
etName = findViewById(R.id.etName);
findViewById(R.id.btnOk).setOnClickListener(v -> onOk());
}
private void onOk() {
String name = etName.getText().toString().trim();
Intent result = new Intent();
result.putExtra("name", name);
setResult(RESULT_OK, result);
finish();
}
}
Кнопка «Назад» без OK закрывает Activity без setResult - для вызывающего кода это отмена (RESULT_CANCELED). В 1С это соответствует флагу отмены в результате оповещения.
3. MainActivity: startActivityForResult и onActivityResult
На главном экране кнопка «Ввести имя» создаёт Intent с action ru.w0rm.intent.action.GetData и вызывает startActivityForResult(intent, 1). Константа 1 - requestCode; если позже добавите второй экран с результатом, заведите отдельные коды и ветку switch (requestCode).
case R.id.btnName:
intent = new Intent("ru.w0rm.intent.action.GetData");
startActivityForResult(intent, 1);
break;
Обработчик результата:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode!= 1) {
return;
}
if (resultCode!= RESULT_OK || data == null) {
Log.d("MainActivity", "GetData canceled or empty data");
return;
}
String name = data.getStringExtra("name");
if (name == null) {
name = "";
}
tvName.setText("Ваше имя: " + name);
}
Три параметра, которые путают новичков: requestCode связывает ответ с конкретным вызовом; resultCode говорит, подтвердил ли пользователь действие; data несёт extra. Без проверки resultCode и data == null легко поймать NPE после Back.
4. Манифест и локальная проверка Jава-приложения
NameActivity регистрируем с intent-filter, иначе система не найдёт обработчик action GetData.
<activity android:name=".NameActivity">
<intent-filter>
<action android:name="ru.w0rm.intent.action.GetData" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Где прописан один и тот же action
Опечатка в action - самая частая причина «Activity not found». Сверьте строки буква в букву.
| Место | Строка action / назначение |
|---|---|
| AndroidManifest.xml, intent-filter NameActivity | ru.w0rm.intent.action.GetData |
| MainActivity, Intent для btnName | ru.w0rm.intent.action.GetData |
| 1С, свойство «Действие» при запуске | ru.w0rm.intent.action.GetData |
| MainActivity, showtime (часть 1, без результата) | ru.w0rm.intent.action.showtime |
| MainActivity, showdate (часть 1) | ru.w0rm.action.showdate (обратите внимание на отличие от showtime) |
GetData не смешиваем с showtime/showdate: другой intent-filter, другой сценарий (ввод и result extra).
Проверка только Java
Соберите debug APK, установите на эмулятор или устройство. «Ввести имя», затем ввод текста и OK. На главном экране в tvName должна появиться строка «Ваше имя: …». Back без OK не меняет подпись (или остаётся прежний текст, если вы не обнуляете поле). В logcat фильтр по тегам NameActivity и MainActivity покажет цепочку setResult / onActivityResult.
5. 1С: команда ПолучитьДанные и асинхронный запуск Java
На стороне 1С:Предприятие 8.3 (мобильная платформа) используем объект ЗапускПриложенияМобильногоУстройства и метод НачатьЗапускПриложенияМобильногоУстройства. Вызов асинхронный: форма не блокируется, результат приходит в процедуру оповещения после закрытия внешнего Activity.
Команда на НачальнаяФорма
Добавьте на общую форму «НачальнаяФорма» реквизит для отображения, например ИмяПользователя (строка), и команду формы «ПолучитьДанные». Клиентский код помещайте в модуль формы под директивой #Если МобильноеПриложениеКлиент, процедуры - с &НаКлиенте.
#Если МобильноеПриложениеКлиент Тогда
&НаКлиенте
Процедура ПолучитьДанные(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗапускаGetData", ЭтотОбъект);
Запуск = Новый ЗапускПриложенияМобильногоУстройства;
Запуск.Действие = "ru.w0rm.intent.action.GetData";
// При необходимости укажите Данные (URI) или ТипДанных, если фильтр Java их требует;
// для демо из части 2 достаточно Действия и category DEFAULT в манифесте.
ЗапускПриложенияМобильногоУстройства.НачатьЗапускПриложенияМобильногоУстройства(
Оповещение, Запуск);
КонецПроцедуры
#КонецЕсли
Поля объекта запуска на практике проверяют так: «Действие» - строка action intent-filter; «Данные» (URI) и «ТипДанных» (MIME) нужны, если манифест Java объявляет data в filter. В нашем GetData filter содержит только action и DEFAULT, поэтому URI не обязателен.
Разбор результата оповещения
В процедуре оповещения читаем параметры завершения и extra с ключом name (аналог getStringExtra("name") в Java). Имена свойств результата в вашей версии мобильной платформы сверьте в синтакс-помощнике конфигуратора; смысл тот же: код результата, признак отмены, набор переданных пар ключ-значение.
#Если МобильноеПриложениеКлиент Тогда
&НаКлиенте
Процедура ПослеЗапускаGetData(РезультатЗапуска, ДополнительныеПараметры) Экспорт
// На этапе отладки временно выведите РезультатЗапуска в сообщение -
// так видно, пришли ли extra и не отменил ли пользователь ввод.
Если РезультатЗапуска = Неопределено Тогда
Возврат;
КонецЕсли;
Если РезультатЗапуска.Отмена Тогда
// Пользователь закрыл Activity без OK: не падаем, старое значение на форме сохраняем.
Возврат;
КонецЕсли;
ИмяИзJava = "";
Если РезультатЗапуска.Данные <> Неопределено Тогда
Если ТипЗнч(РезультатЗапуска.Данные) = Тип("Соответствие") Тогда
ЗначениеExtra = РезультатЗапуска.Данные.Получить("name");
Если ЗначениеExtra <> Неопределено Тогда
ИмяИзJava = Строка(ЗначениеExtra);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(ИмяИзJava) Тогда
Возврат;
КонецЕсли;
ИмяПользователя = ИмяИзJava;
КонецПроцедуры
#КонецЕсли
Обёртка #Если МобильноеПриложениеКлиент не даёт скомпилировать вызов API на десктопной сборке конфигурации. На этапе отладки сообщение с содержимым РезультатЗапуска я оставляю на один-два прогона, пока не убедюсь, что ключ name приходит стабильно.
6. Сквозной сценарий 1С - Java - 1С и типичные сбои
Сквозной цикл: 1С открывает Java, имя возвращается на форму
Финальная проверка - полный цикл на одном устройстве: мобильный клиент 1С с вашей конфигурацией, установленный APK с NameActivity. На «НачальнаяФорма» команда «ПолучитьДанные» открывает Jава-экран ввода; после OK строка появляется в реквизите формы 1С. Если Java уже проверена локально (раздел 4), а 1С падает или молчит, проблема почти всегда в action, в отсутствии APK или в разборе оповещения.
Цепочка, которую я прогоняю руками
- Установлен APK, в настройках нет блокировки установки из неизвестных источников для вашего канала сборки.
- Из Java MainActivity GetData возвращает имя в tvName.
- Из 1С та же action открывает NameActivity.
- Back без OK: форма 1С не меняется, без исключения на клиенте.
- OK с непустым именем: реквизит формы обновлён.
Ошибки после шагов (проверяемый список)
- Activity not found - нет intent-filter GetData, опечатка action, APK не установлен или установлен другой applicationId.
- Java tvName пустой, logcat без setResult - не тот requestCode в
onActivityResult, или NameActivity не вызываетsetResultпередfinish(). - data == null при OK в Java - забыли передать Intent во второй аргумент
setResult. - 1С открывает не то приложение - на устройстве несколько обработчиков с похожим action; для прода иногда задают явный package в запуске, в демо достаточно уникального action.
- Extra не читается в 1С - ключ не
name, или результат ещё не разобран в оповещении (ожидаем асинхронное завершение, не код сразу послеНачать…). - На эмуляторе работает, на телефоне нет - на телефоне старая версия APK без NameActivity; переустановите сборку.
Отладка без догадок
Android: logcat при setResult и в onActivityResult с requestCode и resultCode. 1С: на время разработки выведите в сообщение пользователю сериализацию РезультатЗапуска (отмена, код, ключи extra). После стабилизации сценария сообщение уберите, чтобы не шуметь в поле.
7. Activity Result API и миграция с startActivityForResult
Google помечает классический startActivityForResult как устаревающий в пользу Activity Result API (registerForActivityResult с контрактом StartActivityForResult). Для учебного проекта и старых шаблонов Java-Activity классический путь всё ещё понятен новичкам и совпадает с большинством примеров в сети. При переносе на Result API смысл контракта тот же: requestCode заменяется отдельным launcher на каждый сценарий, а разбор extra остаётся в callback.
На стороне 1С миграция Jава-кода не меняет протокол: action GetData и ключ name в extra по-прежнему единственный контракт между конфигурацией и APK. Обновите только внутреннюю реализацию MainActivity, если хотите соответствовать рекомендациям AndroidX.
8. Расширение контракта: несколько полей и типы данных
Строка в extra name - минимальный пример. Для передачи нескольких значений используйте отдельные ключи (phone, comment) или один ключ с JСОН-строкой, если объём данных велик. Помните лимиты Intent: очень большие payload лучше писать во временный файл и передавать URI с правами FLAG_GRANT_READ_URI_PERMISSION. Для полевых мобильных конфигураций 1С обычно хватает коротких строк: штрихкод, номер документа, ФИО с экрана Jава-сканера.
Согласуйте имена ключей в Java (putExtra) и в процедуре оповещения 1С (Соответствие.Получить). Документируйте контракт в комментарии к команде формы или в README команды разработки, чтобы через полгода не искать ключи по logcat.
9. Безопасность и приватность
Intent с action виден другим приложениям на устройстве, если filter экспортирован неявно. Для внутренних корпоративных APK часто достаточно уникального action и отсутствия лишних intent-filter. Не передавайте через demo-extra пароли и персональные данные без шифрования; для прода рассмотрите явный package при запуске из 1С и подпись APK тем же каналом, что использует ИТ-отдел.
На форме 1С отображайте только те данные, которые пользователь осознанно подтвердил на Jава-экране. Логирование полного РезультатЗапуска в продуктиве отключайте, если extra могут содержать чувствительные поля.
Когда цикл замкнулся, у вас один action GetData в манифесте Java, в MainActivity и в свойстве «Действие» запуска из 1С, плюс согласованный ключ extra name. Дальше по тому же шаблону можно передавать другие строки или набор полей, не рисуя второй экран в конфигурации 1С. Граница демо: только Android с установленным сомранион-приложением; публикация в Google Play, MDM и БСП сюда не входят.
Если после сверки таблицы action и logcat результат всё ещё не доходит до формы, начните с переустановки APK и одного жёстко заданного имени в NameActivity вместо ввода с клавиатуры - так отделите ошибку передачи extra от раскладки или фокуса на EditText.
Материал рассчитан на разработчиков мобильных конфигураций 1С, которые уже прошли односторонний Intent из части 1 и готовы добавить обратный канал данных без выхода в веб-сервисы. Держите таблицу action под рукой при каждой сборке APK и при выкладке обновления конфигурации на тестовый стенд - расхождение одной буквы в строке action стоит часов поиска на устройстве.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
3050 руб.
22.04.2019 124923 739 207
2196 руб.
18.01.2017 152662 235 237
06.10.2026 1897 54 aleksandrboldyusov 0
1 стартмани
13.02.2026 4135 informa1555 5