Мобильное приложение 1С и приложение Java. Совместная работа через Intent. Часть 1. Запуск приложения Java из 1С

31.08.17

Разработка - Мобильная разработка

Пишем два приложения - конфигурацию на мобильной платформе 1С и приложение Java Android Studio. На примере рассматриваем совместное использование двух приложений через Intent. Публикация состоит из 3 частей: Часть 1. Запуск приложения Java из 1С Часть 2. Получаем данные в 1С из приложения Java Часть 3. Отправляем данные в приложение Java из 1С.

Скачать файлы

Наименование Файл Версия Размер
1С Мобильное приложение и приложение Java. Совместная работа через Intent. Часть 1. Запуск приложения Java из 1С:
.zip 25,50Mb
18
.zip 1.0.1 25,50Mb 18 Скачать

Добрый день, уважаемые коллеги!

В данной части рассмотрим создание двух приложений на мобильной платформе и  Java Android Studio. И реализуем вызов приложение Java из 1С.

1. Начнем с реализации мобильного приложения на Java. Запускаем Android Studio

Выбираем версию SDK. Я выбрал минимальную для работы на большинстве мобильных устройств 2.3.3

Открываем activity_main.xml и рисуем две кнопки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:id="@+id/btnTime"
        android:text="Показать время">
    </Button>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:id="@+id/btnDate"
        android:text="Показать дату">
    </Button>
</LinearLayout>

Пишем реализацию MainActivity.java:

package ru.w0rm.develop.intentfilter;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnTime = (Button) findViewById(R.id.btnTime);
        Button btnDate = (Button) findViewById(R.id.btnDate);

        btnTime.setOnClickListener(this);
        btnDate.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent;

        switch(v.getId()) {
            case R.id.btnTime:
                intent = new Intent("ru.w0rm.intent.action.showtime");
                startActivity(intent);
                break;
            case R.id.btnDate:
                intent = new Intent("ru.w0rm.action.showdate");
                startActivity(intent);
                break;
        }

    }
}

В коде мы определили кнопки и присвоили им Activity как обработчик нажатий. В методе onCilck мы определяем какая кнопка была нажата и создаем Intent.

Для создания Intent используем конструктор: Intent (String action). Т.е. мы при создании заполняем атрибут объекта Intent, который называется action. Это обычная строковая константа. Action обычно указывает действие, которое мы хотим произвести. Аction – это некий идентификатор окна, по которому мы его будем вызывать из 1С. В моем случае это ru.w0rm.intent.action.showtime и ru.w0rm.action.showdate

Теперь создадим два дополнительных Layout (окна) time.xml и date.xml. Одно окно будет отображать текущее время, а второе дату. Эти Layout мы будем вызывать из 1С.

time.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tvTime"
        android:text="TextView"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:textSize="30sp">
    </TextView>
</LinearLayout>

date.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tvDate"
        android:text="TextView"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:textSize="30sp">
    </TextView>
</LinearLayout>

Cоздаем класс ActivityTime с суперклассом android.app.Activity.

Пишем код в ActivityTime.java:

package ru.w0rm.develop.intentfilter;

        import java.sql.Date;
        import java.text.SimpleDateFormat;

        import android.app.Activity;
        import android.os.Bundle;
        import android.widget.TextView;

public class ActivityTime extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.time);

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String time = sdf.format(new Date(System.currentTimeMillis()));

        TextView tvTime = (TextView) findViewById(R.id.tvTime);
        tvTime.setText(time);
    }
}

Аналогично создаем класс ActivityDate.

Пишем код в ActivityDate.java:

package ru.w0rm.develop.intentfilter;

import java.sql.Date;
import java.text.SimpleDateFormat;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ActivityDate extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.date);

        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        String date = sdf.format(new Date(System.currentTimeMillis()));

        TextView tvDate = (TextView) findViewById(R.id.tvDate);
        tvDate.setText(date);
    }
}

Теперь только осталось дописать в манифесте:

<activity android:name="ActivityTime">
            <intent-filter>
                <action android:name="ru.w0rm.intent.action.showtime"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>
        <activity android:name="ActivityDate" android:label="Date basic">
            <intent-filter>
                <action android:name="ru.w0rm.action.showdate"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

Здесь мы как раз и инициализируем наши Action. В итоге в манифесте должно получиться следующее:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.w0rm.develop.intentfilter">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ActivityTime">
            <intent-filter>
                <action android:name="ru.w0rm.intent.action.showtime"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>
        <activity android:name="ActivityDate" android:label="Date basic">
            <intent-filter>
                <action android:name="ru.w0rm.action.showdate"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

    </application>

</manifest>

Запускаем мобильное приложение и проверяем. При нажатии на кнопки вызываются два окна. Одно показывает дату, второе время.

2. Теперь создадим приложение на мобильной платформе 1С и будем вызывать наши Activity из приложения на Java

Создаем новую конфигурацию. Имя Intent. Назначение использования - Мобильное устройство.

Создаем общую форму - Начальная форма. На форму добавляем две команды - ПоказатьВремя и ПоказатьДату.

Добавляем обработчики команд:

&НаКлиенте
Процедура ПоказатьВремя(Команда)
	
	#Если МобильноеПриложениеКлиент Тогда 
		НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    	НовВз.Действие="ru.w0rm.intent.action.showtime";
    	НовВз.Запустить(Истина);
	#КонецЕсли

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

&НаКлиенте
Процедура ПоказатьДату(Команда)
	
	#Если МобильноеПриложениеКлиент Тогда 
		НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    	НовВз.Действие="ru.w0rm.action.showdate";
    	НовВз.Запустить(Истина);
	#КонецЕсли

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

В обработчике и указываем Action из форм Java. По ним и будут вызываться необходимые нам Activity.

Открываем Рабочую область начальной страницы и выбираем нашу Начальную форму.

Публикуем мобильное приложение и запускаем. Видим, что при нажатии на кнопки у нас вызываются окна из мобильного приложения написаного на Java.

В следующей части  //infostart.ru/public/613225/ рассмотрим как передавать значения в1С из приложения Java.

Спасибо за внимание!

 

Мобильное приложение Android Studio Intent Java

См. также

"Штрихкод-информер" - мобильный ТСД и прайс-чекер в смартфоне

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн. Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

2880 руб.

03.12.2018    52832    120    102    

148

"Мобильный ТСД" - инвентаризация и сбор штрихкодов для iOS и Android

Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Платформа 1С v8.3 Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Простой мобильный терминал сбора данных для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    89368    469    185    

279

Склад 15 - программа для подключения ТСД к 1С

Логистика, склад и ТМЦ Сканер штрих-кода Терминал сбора данных Мобильная разработка Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

3450 руб.

28.04.2023    7539    14    0    

6

SALE! 15%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 11220 руб.

27.12.2021    30750    71    146    

162

Магазин 15 - приемка товара по штрихкодам или инвентаризация в торговом зале

Логистика, склад и ТМЦ Мобильная разработка Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

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

10650 руб.

30.05.2023    3060    1    0    

3

Базовый курс по разработке мобильных 1C-приложений для Android-устройств. С 31 июля по 6 сентября 2023 г.

1С-программирование Мобильная разработка Платные (руб)

Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.

1500 руб.

08.06.2023    6077    37    0    

43
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. user621724_Dimav1979 396 20.04.17 09:41 Сейчас в теме
Задавайте вопросы. С удовольствием отвечу.
Swetlana; AlexGroovy; dj_serega; smirnov.es; +4 Ответить
4. SyachinS 20.04.17 10:31 Сейчас в теме
(1) Когда 2 часть будет?
5. user621724_Dimav1979 396 20.04.17 10:38 Сейчас в теме
(4) уже пишу
22. пользователь 25.10.21 15:52
Сообщение было скрыто модератором.
...
2. user738101 20.04.17 10:06 Сейчас в теме
2 кнопки и 25,50Mb )
3. user621724_Dimav1979 396 20.04.17 10:11 Сейчас в теме
(2) и это еще архив :)
deutsch2008; +1 Ответить
6. neikist 20.04.17 11:08 Сейчас в теме
Спасибо за статью, вечерком почитаю. Сейчас мельком пробежался по началу статьи и один вопрос возник: почему обработчики кнопкам не в разметке назначаете, а программно? С java и андроидом не особо разбирался, но по моему так разве что какие то анонимные обработчики передавать смысл есть (если это возможно, а судя по тому что нагуглил - невозможно), а явно задаваемые наверно все же лучше в xml описать. Например у меня как у полного чайника сразу вопрос появился: как повесить разные обработчики на кнопки? Судя по тому что нагуглил - нужно реализовать под каждый обработчик объект с соответствующим интерфейсом и его как обработчик устанавливать, другого способа не нашел: https://developer.android.com/reference/android/view/View.OnClickListener.html

Но это так, из разряда придирок мелких.
9. user621724_Dimav1979 396 20.04.17 15:15 Сейчас в теме
(6) спасибо Кирилл за вопрос. По обработчикам Java почитайте StartAndroid
10. neikist 20.04.17 16:44 Сейчас в теме
(9) странно как то что по ссылке не описано задание обработчиков в разметке, например здесь показаны оба способа как в коде, так и в разметке, в свое время почитал немного данный ресурс чтобы хоть какое то представление иметь.
11. Akbis 53 21.04.17 08:41 Сейчас в теме
(10) Программно боле гибче, если понадобится переназначать. Ну здесь можно было и в разметке задать.
12. neikist 21.04.17 20:05 Сейчас в теме
(11) Соглашусь пожалуй, главное не начать набивать эту точку входа десятками вариантов обработок нажатий на разные кнопки, или на одну в разных условиях.
7. flyer 230 20.04.17 11:19 Сейчас в теме
однозначно плюс. жду 2 часть.
8. user621724_Dimav1979 396 20.04.17 13:45 Сейчас в теме
13. Region102 26.04.17 07:50 Сейчас в теме
Это все интересно конечно, но было бы интересно тоже самое сделать с service, для 1с-ников - это типа фоновых заданий. Т.е. оправил данные, они там обсчитались, распечатались и еще что-нибудь и вернулся результат в 1С. Приложение 1с вроде слушает broadcast, оно же как-то получает push, но как возвращать данные из сервиса я так и не понял.
14. Dementor 963 26.04.17 15:01 Сейчас в теме
(13)
Т.е. оправил данные, они там обсчитались, распечатались и еще что-нибудь и вернулся результат в 1С.

Половина ответа в том, как вы собираетесь отправлять данные в сервис. Дело в том, что в мобильной платформе для работы с приложениями Android есть только ЗапускПриложенияМобильногоУстройства (пусть меня поправят, если я ошибаюсь). А этот объект в зависимости от булевского параметра в методе запустить использует или startActivity или startActivityForResult - т.е. никаких startService не предусмотрено вообще, а потому и получение из них данных колбеками или подпиской на "слушанье" тоже не реализовано.

А вот если вы дергаете какую-то активити (возможно даже невидимую), которая стартует сервис, то вы можете продолжить развитие этой темы и сделать обработчик ожидания, который периодически будет дергать вашу активити, которая будет получать данные из сервиса и сообщать назад в 1С.
20. agostev 16.05.20 22:15 Сейчас в теме
(14)

Подскажите, я правильно понимаю, что если в androidmanifest.xml описано так:
<service
name=".print.PassthroughService"
exported="true"/>

то не получится вызвать через ЗапускПриложенияМобильногоУстройства() ?
15. Region102 26.04.17 19:41 Сейчас в теме
Просто когда я дергаю активити, идет инициализация bluetooth ККМ и распечатка чека и все это время у меня заместо активити 1С черный экран ). Я пытался запускать сервис и закрывать активити, в принципе получилось, но мне надо получить результат выполнения операции (ok или результат exception).
16. taishy 52 28.06.17 09:17 Сейчас в теме
(15) Я использовал ASyncTask, и теперь вместо черного экрана четкое отображение текущих действий
19. vers139 53 13.05.19 10:29 Сейчас в теме
(16) Можете подробней описать как это реализовали. Код кинуть. Или хотя бы где бы почитать как это можно сделать?
17. Lupeykin 5 04.12.17 07:07 Сейчас в теме
Этот парень реально умеет писать понятно и кратко, талант
d4rkmesa; user621724_Dimav1979; +2 Ответить
18. KAV2 154 26.07.18 09:09 Сейчас в теме
Вопрос снимается, просьба удалить.
21. maksa2005 474 22.10.21 12:53 Сейчас в теме
Напишите мне пожалуйста где Вы реализовали в проектах Java интерфейс.
23. user635667 137 16.12.21 12:55 Сейчас в теме
Здравствуйте. Есть вопрос по мобильной разработке. Вопрос такой: после перезагрузки телефона каждый раз спрашивает доступ к устройству. Нажимаю ок и пока смартфон включен больше не спрашивает. Сообщение выскакивает в любой форме документа, где подключается оборудование(сканер шк). Не могу найти где это можно автоматизировать. в конфигураторе или в самом андроиде.
Прикрепленные файлы:
24. sultbec 7 30.11.23 11:59 Сейчас в теме
Подскажите в какой версии андроид студио, сдк соберется приложение. не получается куча ошибок.
25. user621724_Dimav1979 396 30.11.23 16:53 Сейчас в теме
(24) на момент написания статьи Android Studio 2.2.3
Оставьте свое сообщение