Мобильное приложение 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С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
1С Мобильное приложение и приложение Java. Совместная работа через Intent. Часть 1. Запуск приложения Java из 1С:
.zip 25,50Mb ver:1.0.1
19
19 Скачать (1 SM) Купить за 1 850 руб.

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

В данной части рассмотрим создание двух приложений на мобильной платформе и  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С v8.3 1С:Конвертация данных Платные (руб)

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

13200 руб.

27.12.2021    38233    108    161    

201

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

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

3000 руб.

03.12.2018    59319    192    103    

172

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

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

2000 руб.

22.04.2019    97283    587    189    

321

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

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

3450 руб.

28.04.2023    9487    15    0    

9

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Финансовые услуги, инвестиции Управленческий учет Платные (руб)

Мобильное приложение и конфигурация 1С для автоматической торговли на бирже через API Тинькофф банка. Достаточно задать настройки, нажать «Пуск», и робот сам торгует ежедневно.

7000 руб.

25.05.2022    4658    1    0    

6

Мобильная разработка WEB-интеграция Программист Мобильная платформа Абонемент ($m)

Экспериментальный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между устройствами Simple и между Simple и бек-системами (например 1С). По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок для поддержки стабильного постоянного соединения, докачки больших файлов и работе в фоне. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

23.08.2024    1220    6    informa1555    1    

13

Мобильная разработка Мобильная платформа Абонемент ($m)

В этом релизе собрано много нового из области интерфейса, связи, хранения и важные новые способы управления. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

25.06.2024    2621    29    informa1555    0    

33
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user621724_Dimav1979 410 20.04.17 09:41 Сейчас в теме
Задавайте вопросы. С удовольствием отвечу.
Swetlana; AlexGroovy; dj_serega; smirnov.es; +4 Ответить
4. SyachinS 20.04.17 10:31 Сейчас в теме
5. user621724_Dimav1979 410 20.04.17 10:38 Сейчас в теме
22. пользователь 25.10.21 15:52
Сообщение было скрыто модератором.
...
2. user738101 20.04.17 10:06 Сейчас в теме
3. user621724_Dimav1979 410 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 410 20.04.17 15:15 Сейчас в теме
(6) спасибо Кирилл за вопрос. По обработчикам Java почитайте StartAndroid
10. neikist 20.04.17 16:44 Сейчас в теме
(9) странно как то что по ссылке не описано задание обработчиков в разметке, например здесь показаны оба способа как в коде, так и в разметке, в свое время почитал немного данный ресурс чтобы хоть какое то представление иметь.
11. Akbis 55 21.04.17 08:41 Сейчас в теме
(10) Программно боле гибче, если понадобится переназначать. Ну здесь можно было и в разметке задать.
12. neikist 21.04.17 20:05 Сейчас в теме
(11) Соглашусь пожалуй, главное не начать набивать эту точку входа десятками вариантов обработок нажатий на разные кнопки, или на одну в разных условиях.
7. flyer 233 20.04.17 11:19 Сейчас в теме
однозначно плюс. жду 2 часть.
8. user621724_Dimav1979 410 20.04.17 13:45 Сейчас в теме
13. Region102 26.04.17 07:50 Сейчас в теме
Это все интересно конечно, но было бы интересно тоже самое сделать с service, для 1с-ников - это типа фоновых заданий. Т.е. оправил данные, они там обсчитались, распечатались и еще что-нибудь и вернулся результат в 1С. Приложение 1с вроде слушает broadcast, оно же как-то получает push, но как возвращать данные из сервиса я так и не понял.
14. Dementor 1035 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. aparinp 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 157 26.07.18 09:09 Сейчас в теме
Вопрос снимается, просьба удалить.
21. maksa2005 550 22.10.21 12:53 Сейчас в теме
Напишите мне пожалуйста где Вы реализовали в проектах Java интерфейс.
23. user635667 16.12.21 12:55 Сейчас в теме
Здравствуйте. Есть вопрос по мобильной разработке. Вопрос такой: после перезагрузки телефона каждый раз спрашивает доступ к устройству. Нажимаю ок и пока смартфон включен больше не спрашивает. Сообщение выскакивает в любой форме документа, где подключается оборудование(сканер шк). Не могу найти где это можно автоматизировать. в конфигураторе или в самом андроиде.
Прикрепленные файлы:
24. sultbec 10 30.11.23 11:59 Сейчас в теме
Подскажите в какой версии андроид студио, сдк соберется приложение. не получается куча ошибок.
25. user621724_Dimav1979 410 30.11.23 16:53 Сейчас в теме
(24) на момент написания статьи Android Studio 2.2.3
Оставьте свое сообщение