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