Как использовать национальную строку (НСтр) в запросе СКД в 1С

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

При разработке мультиязычных отчетов в системах 1С часто возникает необходимость выводить текстовые представления строк на языке текущего сеанса пользователя. Однако если попытаться написать функцию НСтр() непосредственно в тексте запроса (например, НСтр("ru='Задолженность';mn='Худалдан авагчийн өр'") КАК Раздел), платформа выдаст ошибку или проигнорирует выражение.

Выясним причину такого поведения. Функция НСтр() является функцией встроенного языка 1С и исполняется в контексте платформы. Текст запроса 1С транслируется в язык SQL и выполняется на стороне СУБД, где функции встроенного языка недоступны. Рассмотрим основные и наиболее правильные способы решения этой задачи при работе с системой компоновки данных (СКД).

Способ 1. Использование параметров запроса с выражением в СКД

Самый простой и универсальный способ локализации наименований в СКД — это вынос строки в параметр запроса с последующим вычислением функции на уровне выражений СКД.

  1. В тексте запроса заменим жестко заданную строку на параметр:
    
    ВЫБРАТЬ
        &ТекстРазделаЗадолженность КАК Раздел
    
  2. Перейдем на вкладку Параметры в схеме компоновки данных.
  3. Для параметра ТекстРазделаЗадолженность в колонке Выражение укажем вызов функции НСтр(): НСтр("ru='Задолженность покупателей';mn='Худалдан авагчийн өр'")

Язык выражений СКД в отличие от языка SQL-запросов полностью поддерживает работу функции НСтр() и корректно подставит значение в зависимости от языка сессии пользователя.

Способ 2. Заполнение параметра в модуле объекта отчета

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

Для этого в тексте запроса оставляем параметр &ТекстРазделаЗадолженность, а в модуле объекта отчета в обработчике события ПриКомпоновкеРезультата зададим значение параметра перед выводом:


КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
    "ТекстРазделаЗадолженность", 
    НСтр("ru='Задолженность покупателей';mn='Худалдан авагчийн өр'")
);

Способ 3. Вычисляемые поля и выражение представления

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

  1. В тексте запроса выбираем технический идентификатор или числовое значение:
    
    ВЫБРАТЬ
        1 КАК РазделКод
    
  2. Переходим на вкладку Вычисляемые поля в СКД.
  3. Добавляем новое поле Раздел и в колонке Выражение прописываем нужную строку: НСтр("ru='Задолженность покупателей';mn='Худалдан авагчийн өр'")
  4. Если логика вывода более сложная, можно обратиться к функции общего модуля: МойОбщийМодуль.ПолучитьПредставлениеРаздела(РазделКод)

Способ 4. Использование условного оформления

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

  1. В запросе выбираем служебный идентификатор раздела (например, число 1 или строку "ЗадолженностьПокупателей").
  2. На вкладке Условное оформление добавляем новый элемент оформления для поля Раздел.
  3. В поле Текст указываем требуемое представление для конкретного языка или выражение с НСтр().
  4. В условии проверяем значение служебного идентификатора.

Способ 5. Динамическая смена схемы компоновки данных

Если отчеты для разных языковых пользователей имеют сильные различия в структуре или макетах, разберем подход с динамическим выбором схемы СКД на форме отчета.

Создадим в отчете несколько схем компоновки (например, ОсновнаяСхемаКомпоновкиДанных и ОсновнаяСхемаКомпоновкиДанныхMn) и при открытии формы подставим нужный макет:


Язык = НСтр("ru='ru';mn='mn'");
Если Язык = "mn" Тогда
    ПараметрыОтчета.СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанныхMn");
КонецЕсли;

Таким образом, мы рассмотрели основные варианты локализации текстов. Для простых текстовых меток оптимально подходит использование параметров или вычисляемых полей СКД, а для объёмных отчетов со сложной языковой спецификой — использование функций общих модулей или нескольких схем СКД.

← На главную