Как исправить ошибку «Не удалось определить версию Java» при сборке APK в 1С:Предприятии

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

При разработке мобильных приложений на платформе 1С:Предприятие одной из самых досадных преград является этап сборки APK-файла. Часто процесс прерывается критической ошибкой: «Не удалось определить версию Java. Код возврата: 1». Эта проблема может возникнуть даже в тех случаях, когда JDK установлен корректно, а команда java -version в консоли Windows отрабатывает без нареканий. В рамках данной статьи мы подробно разберем причины возникновения этой ошибки и рассмотрим пошаговые инструкции по ее устранению, опираясь на опыт разработчиков и внутренние механизмы платформы.

Выясняем причину ошибки: почему 1С не видит Java

Для начала проанализируем ситуацию. Когда «Сборщик мобильных приложений» пытается начать работу, он первым делом проверяет наличие установленного Java Development Kit (JDK). Платформа делает это, выполняя системную команду через оболочку cmd.exe. Ошибка с кодом возврата 1 сигнализирует о том, что команда была запущена, но завершилась сбоем внутри самой операционной системы или интерпретатора.

Рассмотрим основные факторы, которые приводят к такому поведению:

  1. Пробелы и кириллица в путях: Если имя пользователя Windows содержит пробелы (например, Asus 17.05) или русские буквы, временные файлы, которые создает 1С для парсинга версии Java, могут быть недоступны для записи или некорректно обрабатываться командной оболочкой.
  2. Перенаправление потоков вывода: 1С выполняет команду вида java -version 2>&1. Специфика Java в том, что информация о версии выводится в поток ошибок (stderr), а не в стандартный поток (stdout). Если в системе установлены жесткие политики безопасности или используются «оптимизированные» (пиратские) сборки Windows, механизм перенаправления 2>&1 может блокироваться.
  3. Конфликт разрядностей: При использовании 32-битной версии платформы 1С и 64-битного JDK (или наоборот) могут возникать сложности с доступом к системным папкам из-за механизмов перенаправления WOW64.

Решение 1: Проверка совместимости версий платформы

Прежде чем приступать к правке кода, проанализируем совместимость компонентов. Часто разработчики используют разные версии основной платформы и мобильной платформы. Например, использование основной платформы 8.3.20 для сборки приложения на мобильной платформе 8.3.19 иногда вызывает необъяснимые сбои в работе внутренних скриптов сборщика.

Рекомендация: Убедитесь, что версия сборщика мобильных приложений соответствует версии мобильной платформы, которую вы упаковываете. Если вы используете мобильную платформу 8.3.19, старайтесь выполнять сборку в окружении той же версии. Также проверьте, что в настройках сборщика путь к JDK указан без лишних кавычек и ведет именно к корневой папке установки (например, C:\Java\jdk1.8.0_321).

Решение 2: Очистка путей и перенос временных папок

Если в вашем пути к профилю пользователя есть пробелы, 1С может споткнуться при попытке создать временный файл в каталоге %TEMP%. Проанализируем системные переменные окружения. Самый надежный способ решить проблему с путями — перенести временные папки в корень диска.

Выполним следующие шаги:

  1. Создайте папку C:\Temp.
  2. Зайдите в «Свойства системы» -> «Дополнительные параметры системы» -> «Переменные среды».
  3. Измените значения переменных TEMP и TMP для текущего пользователя на C:\Temp.
  4. Перезагрузите компьютер, чтобы изменения вступили в силу.

Это исключит влияние пробелов в имени пользователя на работу командной строки при вызове java.

Решение 3: Модификация общего модуля FileSystemService

Если изменение системных переменных не помогло, мы можем прибегнуть к более радикальному методу — исправлению логики определения версии Java непосредственно в конфигурации «Сборщик мобильных приложений». Рассмотрим пример кода, который переопределяет путь к рабочему файлу, обходя проблемные системные каталоги.

Найдем в конфигурации общий модуль FileSystemService (ФайловаяСистемаСервис) и функцию JavaVersion (ВерсияJava). Разберем, как изменить формирование командной строки:


// Оригинальный фрагмент кода:
Result = New Structure("RawVersion, Version", Undefined, Undefined);
ReturnCode = Undefined;
WorkingFile = GetTempFileName; // Здесь может возникнуть путь с пробелами
Utility = """" + JavaDir + "\bin\java""";
CommandLine = "cmd /C " + Utility + " -version 1>" + WorkingFile + " 2>>&1";

// Исправленный вариант:
Result = New Structure("RawVersion, Version", Undefined, Undefined);
ReturnCode = Undefined;
WorkingFile = GetTempFileName; 
// Принудительно заменяем путь на безопасный, где точно нет пробелов и кириллицы
WorkingFile = СтрЗаменить(WorkingFile, "C:\Users\Asus 17.05\AppData\Local\Temp", "C:\MobileSDK\Temp"); 
Utility = """" + JavaDir + "\bin\java""";
// Формируем команду с явным указанием путей
CommandLine = "cmd /C " + Utility + " -version 1>" + WorkingFile + " 2>>&1";

Важно: Перед применением этого кода убедитесь, что папка C:\MobileSDK\Temp создана вручную и у пользователя 1С есть права на запись в эту директорию. Этот метод позволяет гарантировать, что результат работы команды java -version будет успешно записан в файл, который 1С затем сможет прочитать и проанализировать.

Решение 4: Настройка прав доступа и антивируса

Проанализируем ситуацию со стороны операционной системы. Ошибка с кодом 1 часто возникает, когда антивирусное ПО блокирует выполнение скриптов из временных папок или запуск дочерних процессов cmd.exe.

Попробуйте выполнить следующие действия:

Решение 5: Установка корректного JDK и переменных окружения

Для мобильной платформы 1С наиболее стабильным вариантом остается Oracle JDK 8 (1.8). Хотя более новые версии платформы заявляют поддержку Java 11 и выше, на практике парсер версии 1С может некорректно обрабатывать строки от сторонних вендоров (например, Adoptium или Liberica).

Рассмотрим правильную настройку переменных среды:

  1. Создайте системную переменную JAVA_HOME, указав путь к JDK (например, C:\Java\jdk1.8.0_321).
  2. Добавьте в начало переменной Path значение %JAVA_HOME%\bin.
  3. Убедитесь, что в системе не установлены другие версии Java, которые могут перехватывать вызов команды через Path.

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

← На главную