Как программно получить представление документа на другом языке в 1С

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

При разработке международных проектов или систем, взаимодействующих с иностранными контрагентами, часто возникает задача вывести строковое представление документа (например, «Реализация товаров и услуг №1 от 01.01.2023») на языке, отличном от языка текущего сеанса пользователя. Несмотря на наличие встроенных механизмов локализации, платформа 1С не предоставляет одной универсальной функции для автоматического перевода ссылочных типов «на лету».

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

Ограничение стандартной функции Формат()

Разберем типичную ошибку начинающих разработчиков. Часто делается попытка использовать функцию Формат() с параметром локализации для ссылки на документ, по аналогии с числами или датами:


// Это не сработает для документа
Представление = Формат(Объект.Ссылка, "Л=en_US"); 

Проанализируем ситуацию: функция Формат() предназначена исключительно для работы с примитивными типами данных (Число, Дата, Булево). Для них она действительно умеет изменять язык вывода (например, писать сумму прописью или название месяца на английском). Однако для ссылочных типов (Документы, Справочники) платформа всегда возвращает стандартное представление на языке текущего сеанса пользователя. Переключить этот язык «внутри» одной строки кода невозможно.

Использование функции НСтр() с указанием кода языка

Если нам необходимо получить перевод статического текста или заголовка объекта, наиболее правильным инструментом будет функция НСтр(). Рассмотрим ее расширенный синтаксис, который часто упускают из виду. Функция позволяет передать вторым параметром код языка, который должен быть использован, независимо от настроек текущего сеанса.

Рассмотрим пример получения заголовка документа:


// Получаем английский вариант заголовка
ТекстЗаголовка = НСтр("ru='Реализация товаров'; en='Sales of goods'", "en");
Сообщить(ТекстЗаголовка); // Выведет: Sales of goods

Этот метод идеально подходит для формирования печатных форм. Однако он требует, чтобы все возможные переводы были заранее прописаны в коде или в свойствах метаданных (синонимах).

Программная сборка представления документа

Поскольку готового метода Представление(ДокументСсылка, "en") не существует, нам придется собрать его самостоятельно. Представление документа обычно состоит из трех частей: Синонима типа объекта, его Номера и Даты. Разберем пошагово, как реализовать такую сборку.

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

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


Функция ПолучитьПредставлениеДокументаНаАнглийском(ДокументСсылка) Экспорт
    
    // 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 рекомендуется:

← На главную