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

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

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

Попытка использовать стандартную функцию Формат() для перевода обычного текста, например, Формат(ДанныеШапки.НаименованиеТовара, "Л=en_US"), не принесет желаемого результата. Функция Формат() предназначена исключительно для форматирования чисел, дат и булевых значений под стандарты конкретной локали (страны), но она не способна переводить произвольный текст (например, превратить «Стул» в «Chair»).

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

---

Решение 1. Локализация статических текстов макета с помощью функции НСтр

Если вам нужно перевести только постоянные надписи в макете (такие как «Цена», «Количество», «Сумма», «Итого», заголовки таблиц и т.д.), самым простым и эффективным способом является использование системной функции НСтр(). Эта функция возвращает строку на нужном языке в зависимости от переданного кода локали.

Рассмотрим, как применить этот метод программно при заполнении параметров макета. Предположим, у нас есть переменная КодЯзыкаПечати, которая определяет целевой язык (например, "en" или "ru").

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


КодЯзыкаПечати = "en"; // Код языка, полученный из настроек или формы

ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТаблицы");

// Перевод статических заголовков и параметров
ОбластьМакета.Параметры.ЗаголовокЦена = НСтр("ru='Цена'; en='Price'", КодЯзыкаПечати);
ОбластьМакета.Параметры.ЗаголовокКоличество = НСтр("ru='Количество'; en='Quantity'", КодЯзыкаПечати);
ОбластьМакета.Параметры.ЗаголовокВсего = НСтр("ru='Всего'; en='Total'", КодЯзыкаПечати);

ТабДок.Вывести(ОбластьМакета);

При таком подходе в самом макете ячейки шапки таблицы должны быть оформлены не как обычный текст, а как Параметры (например, ЗаголовокЦена, ЗаголовокКоличество). Программа сама подставит английские или русские эквиваленты в зависимости от значения переменной КодЯзыкаПечати.

---

Решение 2. Хранение и вывод динамических данных (наименований товаров)

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

Рассмотрим два основных архитектурных подхода к организации хранения мультиязычных данных.

Вариант А. Добавление дополнительных реквизитов (для собственной конфигурации)

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

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


// Выборка данных из запроса
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Ссылка.Наименование КАК НаименованиеРФ,
    |	Ссылка.НаименованиеАнгл КАК НаименованиеENG,
    |	Цена КАК Цена
    |ИЗ
    |	Справочник.Номенклатура КАК Ссылка";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ОбластьМакета = Макет.ПолучитьОбласть("Строка");
    
    Если КодЯзыкаПечати = "en" Тогда
        // Если английский наименование заполнено, выводим его, иначе — русское
        ОбластьМакета.Параметры.Товар = ?(ЗначениеЗаполнено(Выборка.НаименованиеENG), 
                                           Выборка.НаименованиеENG, 
                                           Выборка.НаименованиеРФ);
    Иначе
        ОбластьМакета.Параметры.Товар = Выборка.НаименованиеРФ;
    КонецЕсли;
    
    ОбластьМакета.Параметры.Цена = Выборка.Цена;
    ТабДок.Вывести(ОбластьМакета);
КонецЦикла;

Вариант Б. Использование регистра сведений (для внешних печатных форм)

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

Структура регистра сведений:

  1. Измерение: Объект (Тип: ЛюбаяСсылка — например, СправочникСсылка.Номенклатура)
  2. Измерение: КодЯзыка (Тип: Строка, длина 10 — например, "en", "de")
  3. Ресурс: Перевод (Тип: Строка, длина 150)

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


Функция ПолучитьПереводОбъекта(ОбъектСсылка, КодЯзыка)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ПереводыНаименований.Перевод КАК Перевод
        |ИЗ
        |	РегистрСведений.ПереводыНаименований КАК ПереводыНаименований
        |ГДЕ
        |	ПереводыНаименований.Объект = &Объект
        |	И ПереводыНаименований.КодЯзыка = &КодЯзыка";
        
    Запрос.УстановитьПараметр("Объект", ОбъектСсылка);
    Запрос.УстановитьПараметр("КодЯзыка", КодЯзыка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Перевод;
    КонецЕсли;
    
    // Если перевод не найден, возвращаем стандартное наименование
    Возврат ОбъектСсылка.Наименование;
    
КонецФункции

---

Решение 3. Использование встроенных механизмов БСП (Библиотека стандартных подсистем)

Если вы работаете в современной конфигурации 1С (например, 1С:ERP, 1С:КА, 1С:УТ), в них уже интегрирована библиотека БСП, содержащая готовую подсистему «Мультиязычность».

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

---

Решение 4. Платформенный механизм локализации макетов

В платформе «1С:Предприятие» заложен штатный механизм создания мультиязычных макетов. Если ваша конфигурация поддерживает несколько языков (они добавлены в ветку конфигуратора Общие — Языки), вы можете задать перевод для каждой ячейки макета непосредственно в конфигураторе.

Разберем этот процесс по шагам:

  1. Откройте макет табличного документа в конфигураторе.
  2. Выделите нужную ячейку, откройте ее свойства (F4) и найдите поле Текст.
  3. Нажмите на кнопку с лупой рядом с полем ввода. Откроется окно редактирования строк для всех доступных в системе языков. Введите перевод для каждого языка.
  4. В коде формирования печатной формы перед получением областей укажите свойство КодЯзыкаМакета:

Макет = ПолучитьМакет("Макет");
// Указываем платформе использовать английский язык для статических текстов макета
Макет.КодЯзыкаМакета = "en"; 

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Все текстовые ячейки этой области автоматически выведутся на английском языке
ТабДок.Вывести(ОбластьШапка);

---

Решение 5. Автоматическое форматирование дат и сумм прописью на английском языке

В отличие от перевода названий товаров, перевод дат и сумм прописью на английский язык полностью автоматизирован силами самой платформы «1С:Предприятие».

Вывод даты на английском языке

Для форматирования даты достаточно использовать стандартную функцию Формат() с указанием параметра локализации Л=en_US (или Л=en_GB):


// Пример вывода текущей даты в формате: October 24, 2026
ДатаДокумента = ТекущаяДата();
СтрокаДатаАнгл = Формат(ДатаДокумента, "ДФ='MMMM dd, yyyy'; Л=en_US");

Вывод суммы прописью на английском языке

Функция ЧислоПрописью() также поддерживает локализацию. Для корректного склонения валюты (например, долларов и центов) на английском языке используется специальный форматный параметр:


СуммаДокумента = 1254.50;

// Параметры для английского языка (USD)
ПараметрыПрописи = "L = en_US; SN = USD, cent, cents, , , , , , 2";
СуммаПрописьюENG = ЧислоПрописью(СуммаДокумента, ПараметрыПрописи);

// Результат: One thousand two hundred fifty-four USD 50 cents

---

Резюме и рекомендации

Выбор конкретного метода локализации зависит от ваших технических условий:

← На главную