Как исполнить Java-код в мобильном приложении 1С на Android?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка под мобильную платформу «1С:Предприятие» часто ставит перед программистами сложные задачи, выходящие за рамки стандартного функционала встроенного языка. Например, интеграция специфических Android-библиотек (SDK), работа с низкоуровневым оборудованием, системными сервисами или использование сложных алгоритмов на языке Java. В этой статье мы подробно разберем, как именно можно исполнить Java-код в среде мобильного приложения 1С, рассмотрим альтернативные варианты интеграции через операционную систему Android, а также опровергнем популярные заблуждения касательно работы веб-технологий на мобильной платформе.

Способ 1. Создание внешней компоненты по технологии Native API

Прямой запуск произвольного исходного кода Java на стороне мобильной платформы 1С невозможен, так как в платформу не встроен компилятор или интерпретатор этого языка. Однако мобильная платформа 1С на Android предоставляет полноценную поддержку технологии Native API, которая позволяет создавать внешние компоненты, совмещающие код на C++ и Java.

Рассмотрим структуру и особенности работы такой внешней компоненты подробнее:

  1. Двухуровневая архитектура (C++ и Java): Сама платформа 1С взаимодействует с компонентой через интерфейс C++. Это значит, что вам потребуется написать "мост" на C++, который будет компилироваться в динамические библиотеки (файлы с расширением *.so) под различные архитектуры процессоров Android (ARM, ARM64, x86). Внутри этого C++ кода организуется вызов Java-методов с использованием стандартного механизма JNI (Java Native Interface).
  2. Java-часть компоненты: Непосредственно ваша бизнес-логика (например, работа с Google API, периферией или системными службами) пишется на Java (или Kotlin) в среде разработки Android Studio. Результат компиляции этой части упаковывается в специальный файл с расширением *.apk (при этом он не является самостоятельным приложением).
  3. Упаковка и сборка: Для использования компоненты в 1С создается ZIP-архив, содержащий скомпилированные библиотеки *.so для всех архитектур, скомпилированный *.apk файл с Java-классами и файл описания manifest.xml. Этот архив загружается в конфигурацию 1С как макет с типом "Внешняя компонента". При сборке итогового мобильного приложения сборщик 1С автоматически извлечет Java-классы из вашего APK и внедрит их в общее приложение.

Проанализируем базовую схему вызова внешней компоненты во встроенном языке 1С:


&НаКлиенте
Процедура ПодключитьИнициализироватьКомпоненту()
    
    ИмяФайлаКомпоненты = "ОбщийМакет.МояJavaКомпонента";
    ИмяКомпоненты = "MyJavaComponent";
    
    Если ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, ИмяКомпоненты, ТипВнешнейКомпоненты.Native) Тогда
        КомпонентаJava = Новый(ИмяКомпоненты);
        // Теперь мы можем вызывать методы, которые внутри C++ кода транслируются в Java через JNI
        Результат = КомпонентаJava.ВыполнитьДействие("ПараметрДляJava");
        ПоказатьПредупреждение(, "Результат из Java: " + Результат);
    Иначе
        ВызватьИсключение "Не удалось подключить внешнюю компоненту Java!";
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Взаимодействие через Android Intents (без написания ВК)

Разработка полноценной внешней компоненты на C++ с использованием JNI — процесс трудоемкий, требующий глубоких знаний системного программирования. Малейшая ошибка в управлении памятью в C++ коде приведет к аварийному завершению (крэшу) всего мобильного приложения 1С. Если вам нужно выполнить логику на Java, отличным и более безопасным альтернативным решением является использование механизмов операционной системы Android — Intents (Намерения).

Выясним, как работает эта схема по шагам:

  1. Вы создаете стандартное отдельное приложение на Java в Android Studio, которое выполняет всю необходимую специфическую работу (например, обращается к системным службам, API-интерфейсам или сторонним библиотекам).
  2. В этом приложении регистрируется Intent Filter, позволяющий ему принимать запросы от других приложений.
  3. Из мобильного приложения 1С средствами встроенного языка отправляется системный запрос ЗапускПриложенияМобильногоУстройства, в который передаются параметры для обработки.
  4. После выполнения задачи ваше Java-приложение возвращает результат обратно в 1С.

Посмотрим на пример отправки данных во внешнее Java-приложение из 1С через Intent:


&НаКлиенте
Процедура ОтправитьДанныеВJavaПриложение()
    
    // Создаем объект для запуска стороннего приложения на Android
    ЗапускПриложения = Новый ЗапускПриложенияМобильногоУстройства;
    ЗапускПриложения.Действие = "com.example.translate.ACTION_TRANSLATE";
    
    // Добавляем параметры (ключ-значение), которые прочитает Java-код
    ЗапускПриложения.ДополнительныеДанные.Вставить("text_to_translate", "Hello, world!");
    ЗапускПриложения.ДополнительныеДанные.Вставить("target_lang", "ru");
    
    // Ожидаем возврата результата обратно в 1С
    РезультатЗапуска = ЗапускПриложения.Запустить(Истина);
    
    Если РезультатЗапуска = 0 Тогда // 0 обычно означает успешное выполнение (Activity.RESULT_OK)
        ТекстПеревода = ЗапускПриложения.ДополнительныеДанные.Получить("translated_text");
        ПоказатьПредупреждение(, "Перевод: " + ТекстПеревода);
    КонецЕсли;
    
КонецПроцедуры

Развенчание мифа: Работа JavaScript в поле HTML-документа на Android

В процессе обсуждения интеграционных возможностей мобильной платформы часто возникает ошибочное суждение о том, что на Android-устройствах внутри поля HTML-документа 1С не работает JavaScript. Это утверждение абсолютно неверно.

Мобильная платформа 1С на операционной системе Android использует системный движок WebView (базирующийся на Chromium). JavaScript внутри него работает в полном объеме и с высокой производительностью. Более того, использование связки 1С + HTML/JS является одним из стандартных паттернов проектирования сложных интерфейсов (например, для построения динамических графиков, работы с картами Yandex/Google или отображения кастомных UI-элементов).

Разработчик может организовать двусторонний обмен данными между кодом 1С и JavaScript в поле HTML:

Решение исходной задачи автора: Google Translate API штатными средствами 1С

Если изначальной целью является интеграция с API Google Translate, Yandex, DeepL или любым другим REST-сервисом, то написание Java-кода или внешних компонент вообще не требуется. Мобильная платформа 1С содержит мощный стек сетевых классов, позволяющих общаться с веб-сервисами напрямую.

Разберем готовый шаблон отправки HTTP-запроса к API переводчика непосредственно из мобильной 1С без использования сторонних библиотек:


&НаКлиенте
Функция ПеревестиТекстЧерезREST(Знач ИсходныйТекст, Знач ЯзыкНазначения) Экспорт
    
    // Настраиваем параметры подключения к API
    ИмяСервера = "translation.googleapis.com";
    Ресурс = "/language/translate/v2?key=ВАШ_API_КЛЮЧ";
    
    HTTPСоединение = Новый HTTPСоединение(ИмяСервера, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    
    // Формируем JSON-тело запроса
    СтруктураЗапроса = Новый Структура;
    СтруктураЗапроса.Вставить("q", ИсходныйТекст);
    СтруктураЗапроса.Вставить("target", ЯзыкНазначения);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
    СтрокаТелаЗапроса = ЗаписьJSON.Закрыть();
    
    // Подготавливаем HTTP POST запрос
    HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
    HTTPЗапрос.УстановитьИмяПоляСодержимого("Content-Type", "application/json; charset=utf-8");
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаТелаЗапроса, КодировкаТекста.UTF8, ИспользованиеМаркераВремени.НеИспользовать);
    
    Попытка
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        
        Если HTTPОтвет.КодСостояния = 200 Тогда
            // Успешно, парсим JSON-ответ
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
            ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            // Извлекаем перевод на основе структуры ответа Google API
            Переводы = ДанныеОтвета.data.translations;
            Если Переводы.Количество() > 0 Тогда
                Возврат Переводы[0].translatedText;
            КонецЕсли;
        Иначе
            ВывестиСообщениеПользователю("Ошибка API: Код состояния " + HTTPОтвет.КодСостояния);
        КонецЕсли;
    Исключение
        ВывестиСообщениеПользователю("Не удалось установить соединение с сервером: " + ОписаниеОшибки());
    КонецПопытки;
    
    Возврат "";
КонецФункции

&НаКлиенте
Процедура ВывестиСообщениеПользователю(Знач ТекстСообщения)
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщения;
    Сообщение.Сообщить();
КонецПроцедуры

Резюме и рекомендации

Подводя итог анализу взаимодействия мобильной платформы 1С с Java-окружением, важно придерживаться следующей иерархии проектных решений:

← На главную