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

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

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

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

Как узнать текущий язык сеанса и пользователя

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

Посмотрим на пример кода, позволяющий получить код текущего языка системы:


КодЯзыкаСеанса = ТекущийЯзык().КодЯзыка;
Сообщить("Текущий язык сеанса: " + КодЯзыкаСеанса);

Если же нам требуется проанализировать настройки конкретного пользователя информационной базы, обратимся к объекту ПользовательИнформационнойБазы:


ТекущийИБПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ТекущийИБПользователь.Язык <> Неопределено Тогда
    Сообщить("Язык пользователя: " + ТекущийИБПользователь.Язык.Имя);
Иначе
    Сообщить("У пользователя язык интерфейса не задан явно (используется язык системы или ОС)");
КонецЕсли;

Можно ли программно изменить текущий язык сеанса на лету?

Короткий ответ: нет, изменить язык работающего сеанса невозможно. В платформе 1С:Предприятие объект ТекущийЯзык() доступен исключительно для чтения. Методов вида УстановитьТекущийЯзык() в платформе не предусмотрено.

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

Почему НСтр возвращает пустую строку?

Проанализируем ситуацию, когда НСтр("ru = 'Текст'") возвращает пустую строку "". Причин такого поведения может быть несколько:

  1. Язык сеанса отсутствует в переданном наборе строк. Если сеанс запущен с кодом языка, которого нет в строке (например, en), платформа не выполняет автоматическую подстановку из основного языка конфигурации. Функция не вызывает исключений, а просто возвращает пустую строку.
  2. Влияние региональных настроек операционной системы. Если в свойствах пользователя язык не был жестко задан, платформа может инициализировать язык сеанса на основе локали ОС. На компьютере с англоязычной ОС сеанс запустится с системной локалью, в результате чего локализация ru проигнорируется.
  3. Несовпадение кодов языков в метаданных. Платформа выполняет сопоставление строго по свойству «Код» объекта метаданных «Язык». Если в дереве метаданных код задан как rus, а в литерале указано ru = 'Текст', сопоставление не сработает.
  4. Синтаксическая ошибка в строке. Если нарушена расстановка одинарных или двойных кавычек, пропущены знаки равенства или точки с запятой, функция НСтр перехватывает ошибку внутри себя и возвращает пустую строку.

Варианты решения проблемы

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

Способ 1. Явная передача кода языка вторым параметром

Если нам критически важно гарантированно получить строку на основном языке конфигурации независимо от параметров сеанса, передадим код явно:


Текст = НСтр("ru = 'Привет!'; en = 'Hello!'", Метаданные.ОсновнойЯзык.КодЯзыка);
// или с явным строковым литералом:
Текст = НСтр("ru = 'Привет!'; en = 'Hello!'", "ru");

Способ 2. Использование функции-обертки с контролем возврата

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


Функция ПолучитьЛокализованнуюСтроку(СтрокаЛокализации) Экспорт
    Результат = НСтр(СтрокаЛокализации);
    
    // Если на языке текущего сеанса строка не найдена, пробуем получить на основном языке
    Если ПустаяСтрока(Результат) И Метаданные.ОсновнойЯзык <> Неопределено Тогда
        Результат = НСтр(СтрокаЛокализации, Метаданные.ОсновнойЯзык.КодЯзыка);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Способ 3. Принудительное указание языка при запуске базы

Если проблема носит массовый характер на конкретном рабочем месте из-за региональных настроек ОС, зафиксируем язык запуска:

  1. В окне запуска 1С выделим информационную базу и нажмем «Изменить».
  2. На шаге «Дополнительные параметры запуска» пропишем ключ: /L ru (для языка интерфейса) и при необходимости /VL ru (для региональных настроек дат и чисел).
  3. Для веб-клиента добавим параметр прямо в адресную строку браузера: http://server/base?L=ru.
  4. В конфигураторе откроем меню «Администрирование -> Пользователи», перейдем на вкладку «Прочие» и в поле «Язык» явно укажем нужный язык интерфейса вместо значения «Авто».
← На главную