Разработка под мобильную платформу «1С:Предприятие» часто ставит перед программистами сложные задачи, выходящие за рамки стандартного функционала встроенного языка. Например, интеграция специфических Android-библиотек (SDK), работа с низкоуровневым оборудованием, системными сервисами или использование сложных алгоритмов на языке Java. В этой статье мы подробно разберем, как именно можно исполнить Java-код в среде мобильного приложения 1С, рассмотрим альтернативные варианты интеграции через операционную систему Android, а также опровергнем популярные заблуждения касательно работы веб-технологий на мобильной платформе.
Прямой запуск произвольного исходного кода Java на стороне мобильной платформы 1С невозможен, так как в платформу не встроен компилятор или интерпретатор этого языка. Однако мобильная платформа 1С на Android предоставляет полноценную поддержку технологии Native API, которая позволяет создавать внешние компоненты, совмещающие код на C++ и Java.
Рассмотрим структуру и особенности работы такой внешней компоненты подробнее:
*.so) под различные архитектуры процессоров Android (ARM, ARM64, x86). Внутри этого C++ кода организуется вызов Java-методов с использованием стандартного механизма JNI (Java Native Interface).*.apk (при этом он не является самостоятельным приложением).*.so для всех архитектур, скомпилированный *.apk файл с Java-классами и файл описания manifest.xml. Этот архив загружается в конфигурацию 1С как макет с типом "Внешняя компонента". При сборке итогового мобильного приложения сборщик 1С автоматически извлечет Java-классы из вашего APK и внедрит их в общее приложение.Проанализируем базовую схему вызова внешней компоненты во встроенном языке 1С:
&НаКлиенте
Процедура ПодключитьИнициализироватьКомпоненту()
ИмяФайлаКомпоненты = "ОбщийМакет.МояJavaКомпонента";
ИмяКомпоненты = "MyJavaComponent";
Если ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, ИмяКомпоненты, ТипВнешнейКомпоненты.Native) Тогда
КомпонентаJava = Новый(ИмяКомпоненты);
// Теперь мы можем вызывать методы, которые внутри C++ кода транслируются в Java через JNI
Результат = КомпонентаJava.ВыполнитьДействие("ПараметрДляJava");
ПоказатьПредупреждение(, "Результат из Java: " + Результат);
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту Java!";
КонецЕсли;
КонецПроцедуры
Разработка полноценной внешней компоненты на C++ с использованием JNI — процесс трудоемкий, требующий глубоких знаний системного программирования. Малейшая ошибка в управлении памятью в C++ коде приведет к аварийному завершению (крэшу) всего мобильного приложения 1С. Если вам нужно выполнить логику на Java, отличным и более безопасным альтернативным решением является использование механизмов операционной системы Android — Intents (Намерения).
Выясним, как работает эта схема по шагам:
ЗапускПриложенияМобильногоУстройства, в который передаются параметры для обработки.Посмотрим на пример отправки данных во внешнее 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");
ПоказатьПредупреждение(, "Перевод: " + ТекстПеревода);
КонецЕсли;
КонецПроцедуры
В процессе обсуждения интеграционных возможностей мобильной платформы часто возникает ошибочное суждение о том, что на Android-устройствах внутри поля HTML-документа 1С не работает JavaScript. Это утверждение абсолютно неверно.
Мобильная платформа 1С на операционной системе Android использует системный движок WebView (базирующийся на Chromium). JavaScript внутри него работает в полном объеме и с высокой производительностью. Более того, использование связки 1С + HTML/JS является одним из стандартных паттернов проектирования сложных интерфейсов (например, для построения динамических графиков, работы с картами Yandex/Google или отображения кастомных UI-элементов).
Разработчик может организовать двусторонний обмен данными между кодом 1С и JavaScript в поле HTML:
Элементы.ПолеHTML.Документ.defaultView.имяФункцииJS().ПриНажатии или ПриИзменении поля HTML-документа в 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-окружением, важно придерживаться следующей иерархии проектных решений:
ЗапускПриложенияМобильногоУстройства (Intents). Это значительно снизит вероятность сбоев и упростит отладку.