При разработке мультиязычных отчетов в системах 1С часто возникает необходимость выводить текстовые представления строк на языке текущего сеанса пользователя. Однако если попытаться написать функцию НСтр() непосредственно в тексте запроса (например, НСтр("ru='Задолженность';mn='Худалдан авагчийн өр'") КАК Раздел), платформа выдаст ошибку или проигнорирует выражение.
Выясним причину такого поведения. Функция НСтр() является функцией встроенного языка 1С и исполняется в контексте платформы. Текст запроса 1С транслируется в язык SQL и выполняется на стороне СУБД, где функции встроенного языка недоступны. Рассмотрим основные и наиболее правильные способы решения этой задачи при работе с системой компоновки данных (СКД).
Самый простой и универсальный способ локализации наименований в СКД — это вынос строки в параметр запроса с последующим вычислением функции на уровне выражений СКД.
ВЫБРАТЬ
&ТекстРазделаЗадолженность КАК Раздел
ТекстРазделаЗадолженность в колонке Выражение укажем вызов функции НСтр():
НСтр("ru='Задолженность покупателей';mn='Худалдан авагчийн өр'")
Язык выражений СКД в отличие от языка SQL-запросов полностью поддерживает работу функции НСтр() и корректно подставит значение в зависимости от языка сессии пользователя.
Если значение параметра должно устанавливаться динамически при формировании отчета, передадим его программно.
Для этого в тексте запроса оставляем параметр &ТекстРазделаЗадолженность, а в модуле объекта отчета в обработчике события ПриКомпоновкеРезультата зададим значение параметра перед выводом:
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"ТекстРазделаЗадолженность",
НСтр("ru='Задолженность покупателей';mn='Худалдан авагчийн өр'")
);
Разберем вариант, когда в запросе выбирается технический код или значение, а текстовое представление формируется средствами компоновки данных.
ВЫБРАТЬ
1 КАК РазделКод
Раздел и в колонке Выражение прописываем нужную строку:
НСтр("ru='Задолженность покупателей';mn='Худалдан авагчийн өр'")
МойОбщийМодуль.ПолучитьПредставлениеРаздела(РазделКод)
Проанализируем метод локализации без изменения вычисляемых полей через настройки условного оформления:
1 или строку "ЗадолженностьПокупателей").Раздел.НСтр().Если отчеты для разных языковых пользователей имеют сильные различия в структуре или макетах, разберем подход с динамическим выбором схемы СКД на форме отчета.
Создадим в отчете несколько схем компоновки (например, ОсновнаяСхемаКомпоновкиДанных и ОсновнаяСхемаКомпоновкиДанныхMn) и при открытии формы подставим нужный макет:
Язык = НСтр("ru='ru';mn='mn'");
Если Язык = "mn" Тогда
ПараметрыОтчета.СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанныхMn");
КонецЕсли;
Таким образом, мы рассмотрели основные варианты локализации текстов. Для простых текстовых меток оптимально подходит использование параметров или вычисляемых полей СКД, а для объёмных отчетов со сложной языковой спецификой — использование функций общих модулей или нескольких схем СКД.