В процессе разработки многоязычных конфигураций, локализации решений или проведения автоматизированного тестирования часто возникает задача переключения языка интерфейса. При попытке изменить свойство Язык у текущего пользователя из встроенного языка разработчики сталкиваются с ситуацией: в базе данных настройка сохраняется, однако в текущем окне программы интерфейс остается на прежнем языке. Разберем по шагам, почему так происходит, как правильно сохранить настройку в базе данных и как активировать новый язык для пользователя.
Проанализируем архитектурные особенности платформы 1С:Предприятие 8. Язык интерфейса конфигурации, язык системных ресурсов платформы и региональные установки инициализируются строго один раз — в момент старта клиентского приложения при создании сеанса.
Когда мы обращаемся к свойству Язык объекта ПользовательИнформационнойБазы, мы модифицируем запись в служебной таблице пользователей. Однако контекст уже запущенного сеанса (включая системную функцию ТекущийЯзык()) динамически не перечитывает эти настройки из базы. Поведение полностью аналогично изменению ролей или прав доступа: чтобы новые параметры вступили в силу, сеанс необходимо перезапустить.
Рассмотрим, как правильно получить объект пользователя информационной базы, изменить его язык и сохранить изменения в базу данных на стороне сервера.
Обратите внимание, что объект ПользовательИнформационнойБазы не имеет метода ПолучитьОбъект(), так как сам является объектом управления учетной записью. Свойство Язык принимает значение типа ОбъектМетаданных: Язык.
Посмотрим на пример процедуры смены языка:
&НаСервере
Процедура УстановитьЯзыкТекущегоПользователя(ИмяЯзыка)
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ТекущийПользовательИБ <> Неопределено Тогда
// Находим нужный объект метаданных языка конфигурации
ОбъектМетаданныхЯзык = Метаданные.Языки.Найти(ИмяЯзыка);
Если ОбъектМетаданныхЯзык <> Неопределено Тогда
ТекущийПользовательИБ.Язык = ОбъектМетаданныхЯзык;
ТекущийПользовательИБ.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
После выполнения метода Записать() в конфигураторе и в свойствах пользователя значение языка обновится, однако сеанс продолжит работу со старыми установками.
Чтобы изменения вступили в силу сразу после выполнения кода, инициируем программный перезапуск клиентского приложения. Для этого на клиенте вызовем метод глобального контекста ЗавершитьРаботуСистемы() с параметром перезапуска.
Разберем по шагам реализацию команды смены языка с последующим перезапуском:
Язык у текущего пользователя информационной базы и записываем объект.ЗавершитьРаботуСистемы(Ложь, Истина), где второй параметр указывает платформе на необходимость немедленного повторного старта клиента под текущей учетной записью.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура СменитьЯзыкИПерезапустить(ИмяЯзыка)
// 1. Меняем язык в базе данных
УстановитьЯзыкТекущегоПользователя(ИмяЯзыка);
// 2. Выполняем автоматический перезапуск сеанса
// Первый параметр: Ложь (без подтверждения закрытия)
// Второй параметр: Истина (перезапустить приложение)
ЗавершитьРаботуСистемы(Ложь, Истина);
КонецПроцедуры
Если задача переключения языка связана не с изменением всего интерфейса конфигурации, а с формированием отчетов, печатных форм или обработкой строковых данных (например, при проведении тестов), перезапуск сеанса не требуется. Платформа предоставляет встроенные инструменты локализации отдельных элементов:
КодЯзыкаМакета.Формат() поддерживает параметр локализации, например:
СтрокаДаты = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy; Л=en_US");
НСтр() позволяет извлекать представление для конкретного кода языка напрямую из исходного текста:
ТекстСообщения = НСтр("ru='Привет'; en='Hello'", "en");
Выясним особенности управления языком в сценариях автоматизированного тестирования и при работе через браузер:
ЗапуститьСистему() можно явно задать параметры локализации:
/L <код_языка> — задает язык интерфейса платформы (например, /L en или /L ru)./VL <код_локализации> — задает региональные настройки сеанса для форматирования дат, чисел и времени.http://server/base/en_US/).Таким образом, для полной смены языка интерфейса текущего пользователя обязателен перезапуск сеанса через ЗавершитьРаботуСистемы(Ложь, Истина), а для локального вывода данных и тестирования печатных форм достаточно использовать встроенные механизмы локализации платформы без закрытия программы.