При разработке международных проектов или систем, взаимодействующих с иностранными контрагентами, часто возникает задача вывести строковое представление документа (например, «Реализация товаров и услуг №1 от 01.01.2023») на языке, отличном от языка текущего сеанса пользователя. Несмотря на наличие встроенных механизмов локализации, платформа 1С не предоставляет одной универсальной функции для автоматического перевода ссылочных типов «на лету».
В этой статье мы подробно разберем, почему стандартный метод Формат() не подходит для документов, как правильно использовать возможности функции НСтр(), и какие обходные пути существуют для решения этой задачи в современных версиях платформы 1С:Предприятие 8.3.
Разберем типичную ошибку начинающих разработчиков. Часто делается попытка использовать функцию Формат() с параметром локализации для ссылки на документ, по аналогии с числами или датами:
// Это не сработает для документа
Представление = Формат(Объект.Ссылка, "Л=en_US");
Проанализируем ситуацию: функция Формат() предназначена исключительно для работы с примитивными типами данных (Число, Дата, Булево). Для них она действительно умеет изменять язык вывода (например, писать сумму прописью или название месяца на английском). Однако для ссылочных типов (Документы, Справочники) платформа всегда возвращает стандартное представление на языке текущего сеанса пользователя. Переключить этот язык «внутри» одной строки кода невозможно.
Если нам необходимо получить перевод статического текста или заголовка объекта, наиболее правильным инструментом будет функция НСтр(). Рассмотрим ее расширенный синтаксис, который часто упускают из виду. Функция позволяет передать вторым параметром код языка, который должен быть использован, независимо от настроек текущего сеанса.
Рассмотрим пример получения заголовка документа:
// Получаем английский вариант заголовка
ТекстЗаголовка = НСтр("ru='Реализация товаров'; en='Sales of goods'", "en");
Сообщить(ТекстЗаголовка); // Выведет: Sales of goods
Этот метод идеально подходит для формирования печатных форм. Однако он требует, чтобы все возможные переводы были заранее прописаны в коде или в свойствах метаданных (синонимах).
Поскольку готового метода Представление(ДокументСсылка, "en") не существует, нам придется собрать его самостоятельно. Представление документа обычно состоит из трех частей: Синонима типа объекта, его Номера и Даты. Разберем пошагово, как реализовать такую сборку.
Метаданные().Синоним возвращает строку только для текущего языка. Для получения иного языка придется использовать либо внешние словари, либо функцию НСтр(), в которой прописаны синонимы.Формат() с параметром локализации.Посмотрим на пример функции, которая формирует англоязычное представление:
Функция ПолучитьПредставлениеДокументаНаАнглийском(ДокументСсылка) Экспорт
// 1. Получаем название типа (нужно определить соответствие)
ИмяМетаданных = ДокументСсылка.Метаданные().Имя;
Если ИмяМетаданных = "РеализацияТоваровУслуг" Тогда
ТипТекст = "Sales Invoice";
ИначеЕсли ИмяМетаданных = "ПоступлениеТоваровУслуг" Тогда
ТипТекст = "Purchase Invoice";
Иначе
ТипТекст = "Document";
КонецЕсли;
// 2. Форматируем дату на английском
ДатаТекст = Формат(ДокументСсылка.Дата, "ДЛФ=D; Л=en_US");
// 3. Собираем результат
Возврат СтрШаблон("%1 #%2 dated %3", ТипТекст, ДокументСсылка.Номер, ДатаТекст);
КонецФункции
Начиная с версии платформы 8.3.14, у разработчиков появился мощный инструмент — метод УстановитьКодЛокализацииПечати(). Проанализируем его возможности. Этот метод позволяет временно, в рамках текущего потока исполнения, изменить язык, который будет использоваться для формирования стандартных представлений и форматных строк.
Рассмотрим, как это упрощает жизнь при выводе данных в печатную форму:
// Сохраняем текущую локализацию, если нужно вернуть её позже
СтараяЛокализация = ДинамическийСписок.КодЛокализации; // (Пример контекста)
// Устанавливаем английский язык для механизмов печати
УстановитьКодЛокализацииПечати("en_US");
// Теперь Формат() без явного указания "Л=" будет работать на английском
СуммаПрописью = ЧислоПрописью(150, "L=en_US", "");
ДатаСтр = Формат(ТекущаяДата(), "ДЛФ=DD");
// Не забываем, что это влияет в основном на системные функции вывода
Важный момент: этот метод не переведет автоматически синонимы ваших справочников из метаданных, но он значительно облегчает работу с системными представлениями дат, чисел и валют.
Если ваша конфигурация построена на базе БСП (что актуально для большинства современных решений, таких как ERP, КА, УТ 11), рекомендуем обратить внимание на подсистему «Мультиязычность». Она предоставляет готовые регистры сведений для хранения переводов данных (наименований товаров, характеристик) и программный интерфейс для их получения.
В БСП можно использовать программные вызовы для получения представлений объектов, если для них заполнены переводы в интерфейсе программы:
// Пример логики БСП (пути к методам могут зависеть от версии БСП)
ЗначениеНаДругомЯзыке = Мультиязычность.ПредставлениеОбъекта(СсылкаНаОбъект, КодЯзыка);
Этот подход является наиболее масштабируемым, так как позволяет пользователям самим заполнять переводы названий товаров или статей расходов прямо в режиме «1С:Предприятие» без изменения кода.
Выясним причину, по которой метод ПользовательИнформационнойБазы.Язык не помогает решить задачу мгновенно. Как было отмечено в ходе обсуждения, запись нового языка в свойства пользователя:
Пользователь1с = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователь1с.Язык = Метаданные.Языки.English;
Пользователь1с.Записать();
не меняет язык текущего активного сеанса. Эти изменения вступят в силу только при следующем входе пользователя в систему. Поэтому для динамического получения строкового представления в текущем коде данный способ бесполезен.
Для программного получения представления документа на другом языке в 1С 8.3 рекомендуется:
НСтр("ru='...'; en='...'", "en") для статических строк и заголовков.Формат(Дата, "Л=en_US") для локализации дат и чисел.УстановитьКодЛокализацииПечати() перед формированием отчетов или печатных форм.