Как настроить и переключить два языка в мобильном приложении 1С?

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

Разработка мультиязычных мобильных приложений на платформе 1С:Предприятие имеет свои уникальные особенности, которые кардинально отличаются от работы обычного тонкого или толстого клиента. Часто разработчики сталкиваются с ситуацией: в конфигурации добавлены два языка (например, русский и английский), синонимы всех объектов корректно заполнены, для пользователя информационной базы программно или вручную установлен английский язык, но интерфейс приложения на мобильном устройстве упорно продолжает отображаться на русском. При этом функции проверки показывают, что текущим языком сеанса назначен английский.

В этой статье мы подробно разберем, почему возникает этот конфликт локализации, как работает жизненный цикл мобильного приложения 1С при взаимодействии с операционной системой (Android или iOS) и какими способами можно реализовать полноценное переключение языков.

Почему стандартный механизм переключения через пользователя ИБ не работает на мобильных устройствах?

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

В мобильной платформе 1С логика инициализации работает совершенно иначе. Проанализируем ключевые причины несоответствия:

  1. Приоритет операционной системы: При холодном старте мобильная платформа 1С в первую очередь обращается к региональным настройкам самого мобильного устройства. Она запрашивает текущий язык операционной системы и сопоставляет его со списком локалей, встроенных в метаданные конфигурации. Если системный язык совпадает с одним из доступных языков конфигурации, графическая оболочка (кнопки, меню, стандартные формы) принудительно отрисовывается на этом языке.
  2. Игнорирование настроек пользователя ИБ для интерфейса: Инициализация графического ядра мобильного приложения происходит до того, как мобильная платформа выполнит вход в базу данных под конкретным пользователем и прочитает его персональные настройки. В результате возникает внутренний конфликт: функции работы с текстом считают, что активен английский язык, а визуальные элементы заблокированы на русском.

Различие между функциями ТекущийЯзык() и ТекущийЯзыкСистемы()

Для понимания сути проблемы важно четко разделять назначение системных функций платформы 1С. Разберем их различия подробнее:

Функция ТекущийЯзыкСистемы() возвращает код языка локализации самой операционной системы мобильного устройства (например, «ru» или «en»). На это значение разработчик никак не может повлиять программно из кода 1С — оно полностью контролируется настройками смартфона или планшета.

Функция ТекущийЯзык() возвращает объект метаданных типа Язык, установленный для текущего сеанса 1С. Именно из-за этого различия у автора темы возникала ситуация, когда код:


Язык = ТекущийЯзык();
ЗаголовокТекст = НСтр("ru = 'Уведомления('; en = 'Notifications('", Язык.КодЯзыка);

отрабатывал корректно и возвращал английский вариант строки, так как сеанс пользователя действительно имел статус «en». При этом все стандартные элементы форм, командная панель и синонимы объектов оставались на русском языке, поскольку графическая оболочка ориентировалась на ТекущийЯзыкСистемы().

Решение проблемы: Холодный старт мобильного приложения

Если вы изменили язык интерфейса в настройках самого телефона (например, перевели Android или iOS с русского на английский), вы можете обнаружить, что интерфейс мобильного приложения 1С всё равно остался прежним. Выясним причину этого поведения.

Современные мобильные операционные системы оптимизируют использование оперативной памяти. Когда вы сворачиваете приложение или переходите на главный экран, операционная система не закрывает программу, а переводит её в фоновый режим ожидания (суспенд). Мобильная платформа 1С кэширует языковые настройки системы ровно один раз — в момент первого холодного запуска.

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

  1. Перейдите в настройки мобильного телефона и переключите системный язык на требуемый (например, English).
  2. Вызовите меню запущенных приложений (диспетчер задач) на вашем мобильном устройстве.
  3. Смахните («убейте») карточку мобильного приложения 1С, полностью выгрузив процесс из оперативной памяти устройства. Также можно очистить кэш приложения через системные настройки Android.
  4. Запустите приложение заново. При холодном старте платформа считает обновленные параметры системы, и интерфейс переключится на нужный язык.

Профессиональные обходные пути (Workarounds) для разработчиков

Очевидно, что требовать от конечных пользователей менять язык всей операционной системы телефона ради одного приложения — это нежизнеспособный сценарий. Если перед вами стоит задача реализовать выбор языка внутри настроек самого приложения, стандартный механизм автоматических синонимов объектов использовать не получится. Рассмотрим проверенные архитектурные решения.

Вариант А. Динамическая локализация элементов форм

Этот метод основан на полном отказе от стандартных синонимов платформы в пользу программной перезаписи заголовков элементов при создании форм. Посмотрим на пример реализации данного алгоритма:

1. Создайте в конфигурации регистр сведений или макет в формате JSON, в котором будут храниться переводы для каждого элемента интерфейса. Структура данных может выглядеть следующим образом:


// Пример структуры JSON-макета локализации
{
    "ru": {
        "FormTitle": "Список уведомлений",
        "ButtonSend": "Отправить",
        "LabelStatus": "Статус операции"
    },
    "en": {
        "FormTitle": "Notifications List",
        "ButtonSend": "Send",
        "LabelStatus": "Operation Status"
    }
}

2. Внедрите в общие модули процедуру динамической локализации, которая будет вызываться в обработчике ПриСозданииНаСервере для каждой формы приложения:


Процедура ЛокализоватьФорму(Форма, КодЯзыка) Экспорт
    
    // Получаем структуру перевода для конкретной формы и языка
    СтруктураПеревода = ПолучитьДанныеПеревода(Форма.ИмяФормы, КодЯзыка);
    
    Если СтруктураПеревода = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Устанавливаем заголовок самой формы
    Если СтруктураПеревода.Свойство("ЗаголовокФормы") Тогда
        Форма.Заголовок = СтруктураПеревода.ЗаголовокФормы;
    КонецЕсли;
    
    // Обходим все визуальные элементы формы
    Для Каждого Элемент Из Форма.Элементы Цикл
        
        ИмяЭлемента = Элемент.Имя;
        Если Не СтруктураПеревода.Свойство(ИмяЭлемента) Тогда
            Продолжить;
        КонецЕсли;
        
        // В зависимости от типа элемента меняем нужные свойства
        Если ТипЗнч(Элемент) = Тип("КнопкаФормы") 
            Или ТипЗнч(Элемент) = Тип("ПолеФормы") 
            Или ТипЗнч(Элемент) = Тип("ДекорацияФормы") Тогда
            
            Элемент.Заголовок = СтруктураПеревода[ИмяЭлемента];
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

При таком подходе вы храните выбранный пользователем язык во внутренней константе мобильного приложения и принудительно локализуете интерфейс независимо от системного языка устройства.

Вариант Б. Принудительное указание кода языка в НСтр()

Если вам необходимо выводить программные предупреждения, сообщения пользователю или генерировать динамический текст, всегда явно передавайте вторым параметром код языка, сохраненный в пользовательских настройках приложения. Избегайте использования НСтр() в базовом виде без параметров на мобильной платформе.

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


// Переменная ВыбранныйКодЯзыка хранит значение "ru" или "en" из настроек приложения
ТекстСообщения = НСтр("ru = 'Успешно сохранено!'; en = 'Successfully saved!'", ВыбранныйКодЯзыка);
ПоказатьПредупреждение(, ТекстСообщения);

Вариант В. Особенности сборки пакета мобильного приложения

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

← На главную