Как программно изменить язык текущего пользователя и применить его в сеансе 1С?

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

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

Причина проблемы: почему язык не меняется «на лету»

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

Когда мы обращаемся к свойству Язык объекта ПользовательИнформационнойБазы, мы модифицируем запись в служебной таблице пользователей. Однако контекст уже запущенного сеанса (включая системную функцию ТекущийЯзык()) динамически не перечитывает эти настройки из базы. Поведение полностью аналогично изменению ролей или прав доступа: чтобы новые параметры вступили в силу, сеанс необходимо перезапустить.

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

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

Обратите внимание, что объект ПользовательИнформационнойБазы не имеет метода ПолучитьОбъект(), так как сам является объектом управления учетной записью. Свойство Язык принимает значение типа ОбъектМетаданных: Язык.

Посмотрим на пример процедуры смены языка:


&НаСервере
Процедура УстановитьЯзыкТекущегоПользователя(ИмяЯзыка)
    
    ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    
    Если ТекущийПользовательИБ <> Неопределено Тогда
        // Находим нужный объект метаданных языка конфигурации
        ОбъектМетаданныхЯзык = Метаданные.Языки.Найти(ИмяЯзыка);
        
        Если ОбъектМетаданныхЯзык <> Неопределено Тогда
            ТекущийПользовательИБ.Язык = ОбъектМетаданныхЯзык;
            ТекущийПользовательИБ.Записать();
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Применение изменений: программный перезапуск клиентского сеанса

Чтобы изменения вступили в силу сразу после выполнения кода, инициируем программный перезапуск клиентского приложения. Для этого на клиенте вызовем метод глобального контекста ЗавершитьРаботуСистемы() с параметром перезапуска.

Разберем по шагам реализацию команды смены языка с последующим перезапуском:

  1. На сервере обновляем свойство Язык у текущего пользователя информационной базы и записываем объект.
  2. На клиенте запрашиваем подтверждение или сразу вызываем перезапуск приложения.
  3. Вызываем метод ЗавершитьРаботуСистемы(Ложь, Истина), где второй параметр указывает платформе на необходимость немедленного повторного старта клиента под текущей учетной записью.

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура СменитьЯзыкИПерезапустить(ИмяЯзыка)
    
    // 1. Меняем язык в базе данных
    УстановитьЯзыкТекущегоПользователя(ИмяЯзыка);
    
    // 2. Выполняем автоматический перезапуск сеанса
    // Первый параметр: Ложь (без подтверждения закрытия)
    // Второй параметр: Истина (перезапустить приложение)
    ЗавершитьРаботуСистемы(Ложь, Истина);
    
КонецПроцедуры

Альтернативные способы работы с многоязычностью без перезапуска

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

  1. Формирование печатных форм: для макетов и табличных документов можно явно переопределить язык генерации через свойство КодЯзыкаМакета.
  2. Форматирование чисел и дат: функция Формат() поддерживает параметр локализации, например: СтрокаДаты = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy; Л=en_US");
  3. Многоязычные строки: функция НСтр() позволяет извлекать представление для конкретного кода языка напрямую из исходного текста: ТекстСообщения = НСтр("ru='Привет'; en='Hello'", "en");

Управление языком при пакетном тестировании и в веб-клиенте

Выясним особенности управления языком в сценариях автоматизированного тестирования и при работе через браузер:

  1. Ключи командной строки: при программном запуске клиента с помощью ЗапуститьСистему() можно явно задать параметры локализации:
    • /L <код_языка> — задает язык интерфейса платформы (например, /L en или /L ru).
    • /VL <код_локализации> — задает региональные настройки сеанса для форматирования дат, чисел и времени.
  2. Веб-клиент: в веб-клиенте язык и локаль можно задать без модификации пользователя базы данных, указав код языка прямо в URL-адресе информационной базы (например, http://server/base/en_US/).

Таким образом, для полной смены языка интерфейса текущего пользователя обязателен перезапуск сеанса через ЗавершитьРаботуСистемы(Ложь, Истина), а для локального вывода данных и тестирования печатных форм достаточно использовать встроенные механизмы локализации платформы без закрытия программы.

← На главную