При разработке печатных форм в «1С:Предприятии» (особенно внешних печатных форм для внешнеэкономической деятельности) часто возникает задача локализации. Разработчики сталкиваются с необходимостью вывести макет, заголовки, а также сами данные (например, наименования товаров или контрагентов) на английском или любом другом иностранном языке.
Попытка использовать стандартную функцию Формат() для перевода обычного текста, например, Формат(ДанныеШапки.НаименованиеТовара, "Л=en_US"), не принесет желаемого результата. Функция Формат() предназначена исключительно для форматирования чисел, дат и булевых значений под стандарты конкретной локали (страны), но она не способна переводить произвольный текст (например, превратить «Стул» в «Chair»).
В этой статье мы подробно и по шагам разберем, как правильно реализовать вывод печатных форм на разных языках, разделив задачу на локализацию статического текста макета и перевод динамических данных из базы.
---
Если вам нужно перевести только постоянные надписи в макете (такие как «Цена», «Количество», «Сумма», «Итого», заголовки таблиц и т.д.), самым простым и эффективным способом является использование системной функции НСтр(). Эта функция возвращает строку на нужном языке в зависимости от переданного кода локали.
Рассмотрим, как применить этот метод программно при заполнении параметров макета. Предположим, у нас есть переменная КодЯзыкаПечати, которая определяет целевой язык (например, "en" или "ru").
Разберем пример кода для заполнения параметров области макета:
КодЯзыкаПечати = "en"; // Код языка, полученный из настроек или формы
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТаблицы");
// Перевод статических заголовков и параметров
ОбластьМакета.Параметры.ЗаголовокЦена = НСтр("ru='Цена'; en='Price'", КодЯзыкаПечати);
ОбластьМакета.Параметры.ЗаголовокКоличество = НСтр("ru='Количество'; en='Quantity'", КодЯзыкаПечати);
ОбластьМакета.Параметры.ЗаголовокВсего = НСтр("ru='Всего'; en='Total'", КодЯзыкаПечати);
ТабДок.Вывести(ОбластьМакета);
При таком подходе в самом макете ячейки шапки таблицы должны быть оформлены не как обычный текст, а как Параметры (например, ЗаголовокЦена, ЗаголовокКоличество). Программа сама подставит английские или русские эквиваленты в зависимости от значения переменной КодЯзыкаПечати.
---
Перевод названий товаров, услуг или контрагентов — более сложная задача, так как эти данные хранятся в базе данных и вводятся пользователями. Автоматический перевод «на лету» через онлайн-переводчики в учетных системах не рекомендуется из-за возможных неточностей, которые критичны для финансовых и таможенных документов. Переводы должны храниться непосредственно в информационной базе.
Рассмотрим два основных архитектурных подхода к организации хранения мультиязычных данных.
Если вы можете изменять конфигурацию, то самым прямолинейным способом будет добавление дополнительного реквизита в справочник Номенклатура (например, НаименованиеАнгл с типом Строка).
При формировании печатной формы мы будем проверять, какой язык выбран для печати, и выводить соответствующий реквизит:
// Выборка данных из запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка.Наименование КАК НаименованиеРФ,
| Ссылка.НаименованиеАнгл КАК НаименованиеENG,
| Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Ссылка";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
Если КодЯзыкаПечати = "en" Тогда
// Если английский наименование заполнено, выводим его, иначе — русское
ОбластьМакета.Параметры.Товар = ?(ЗначениеЗаполнено(Выборка.НаименованиеENG),
Выборка.НаименованиеENG,
Выборка.НаименованиеРФ);
Иначе
ОбластьМакета.Параметры.Товар = Выборка.НаименованиеРФ;
КонецЕсли;
ОбластьМакета.Параметры.Цена = Выборка.Цена;
ТабДок.Вывести(ОбластьМакета);
КонецЦикла;
Если вы разрабатываете внешнюю печатную форму и не имеете права изменять типовую конфигурацию (добавлять новые реквизиты в справочники), правильным архитектурным решением будет создание независимого регистра сведений ПереводыНаименований.
Структура регистра сведений:
Объект (Тип: ЛюбаяСсылка — например, СправочникСсылка.Номенклатура)КодЯзыка (Тип: Строка, длина 10 — например, "en", "de")Перевод (Тип: Строка, длина 150)В коде печатной формы получение данных будет выглядеть следующим образом:
Функция ПолучитьПереводОбъекта(ОбъектСсылка, КодЯзыка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПереводыНаименований.Перевод КАК Перевод
|ИЗ
| РегистрСведений.ПереводыНаименований КАК ПереводыНаименований
|ГДЕ
| ПереводыНаименований.Объект = &Объект
| И ПереводыНаименований.КодЯзыка = &КодЯзыка";
Запрос.УстановитьПараметр("Объект", ОбъектСсылка);
Запрос.УстановитьПараметр("КодЯзыка", КодЯзыка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Перевод;
КонецЕсли;
// Если перевод не найден, возвращаем стандартное наименование
Возврат ОбъектСсылка.Наименование;
КонецФункции
---
Если вы работаете в современной конфигурации 1С (например, 1С:ERP, 1С:КА, 1С:УТ), в них уже интегрирована библиотека БСП, содержащая готовую подсистему «Мультиязычность».
Этот механизм позволяет полностью отказаться от ручной доработки конфигурации:
Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм. Здесь для каждого макета можно настроить перевод ячеек без изменения конфигурации. Платформа сама подставит нужный язык макета при формировании документа.---
В платформе «1С:Предприятие» заложен штатный механизм создания мультиязычных макетов. Если ваша конфигурация поддерживает несколько языков (они добавлены в ветку конфигуратора Общие — Языки), вы можете задать перевод для каждой ячейки макета непосредственно в конфигураторе.
Разберем этот процесс по шагам:
КодЯзыкаМакета:
Макет = ПолучитьМакет("Макет");
// Указываем платформе использовать английский язык для статических текстов макета
Макет.КодЯзыкаМакета = "en";
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Все текстовые ячейки этой области автоматически выведутся на английском языке
ТабДок.Вывести(ОбластьШапка);
---
В отличие от перевода названий товаров, перевод дат и сумм прописью на английский язык полностью автоматизирован силами самой платформы «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
---
Выбор конкретного метода локализации зависит от ваших технических условий:
НСтр().Формат() и ЧислоПрописью() с параметром локали en_US.