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

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

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

Рассмотрим подробно несколько методов реализации этой задачи: от использования штатных возможностей Системы компоновки данных (СКД) до применения фоновых заданий с заданной локалью.

Метод 1. Использование штатных возможностей СКД и кода языка макета

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

Проанализируем программный способ установки языка. При генерации макета компоновки данных мы можем явно указать код языка. Разберем этот процесс на примере кода:


// Создаем стандартные объекты для формирования отчета на СКД
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// Важный момент: указываем нужный код языка (например, "en" для английского)
// Это заставит систему брать синонимы из метаданных для указанного языка
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, 
    КомпоновщикНастроек.ПолучитьНастройки(), , , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), , "en");

// Дальнейший вывод в процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Важно: Для того чтобы этот метод сработал, у вас в дереве конфигурации в ветке "Общие -> Языки" должен быть добавлен соответствующий язык (например, Английский с кодом en), и для всех реквизитов, участвующих в отчете, должны быть прописаны англоязычные синонимы.

Метод 2. Программное переключение языка макета табличного документа

Если отчет строится не на СКД, а на обычном макете (типа "Табличный документ"), мы можем воспользоваться свойством КодЯзыкаМакета. Это позволяет использовать один и тот же макет, в ячейках которого текст задан с помощью функции НСтр().

Разберем алгоритм действий:

  1. В макете в нужных ячейках вместо простого текста пишем выражения или параметры.
  2. Для статического текста используем формат НСтр("ru='Склад'; en='Warehouse'").
  3. Перед получением макета в коде устанавливаем нужный код языка.

Посмотрим на пример реализации:


// Выбираем код языка на основе настройки (например, галочки на форме)
КодЯзыкаПечати = ?(Объект.ФормироватьНаАнглийском, "en", "ru");

// Получаем макет из объекта
Макет = ЭтотОбъект.ПолучитьМакет("ОсновнойМакет");

// Устанавливаем код языка для макета
Макет.КодЯзыкаМакета = КодЯзыкаПечати;

// Теперь при выводе областей через макет.ПолучитьОбласть(), 
// все функции НСтр() внутри будут возвращать английский текст
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

Метод 3. Формирование отчета через фоновое задание (Локализация сеанса)

Это самый "чистый" и современный способ, если нужно перевести не только заголовки, но и системные представления (даты, числа, системные перечисления). При запуске фонового задания на сервере мы можем передать параметры локализации. Сеанс фонового задания будет запущен с указанным языком и страной.

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


// Код на клиенте, инициирующий процесс
ПараметрыЗадания = Новый Структура("Настройки, АдресХранилища", НастройкиОтчета, УникальныйИдентификатор);
    
// Запускаем задание с явным указанием кода языка "en" и страны "US"
// Это изменит формат дат (MM/DD/YYYY) и чисел для всего потока выполнения
ФоновоеЗадание = ФоновыеЗадания.Выполнить("МодульОтчетов.СформироватьОтчетНаСервере", 
    ПараметрыЗадания, , "en_US");

// Ожидаем завершения и получаем готовый ТабличныйДокумент из хранилища

Этот метод позволяет избежать ручного перевода дат и валют, так как стандартные функции Формат() и представления объектов будут автоматически подстраиваться под американские или британские стандарты.

Метод 4. Перевод данных (содержания справочников)

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

Рассмотрим две стратегии перевода данных:

  1. Дополнительные реквизиты: Добавляем в справочник Номенклатура реквизит НаименованиеАнгл. В запросе отчета используем условие:
    
    ВЫБОР 
        КОГДА &АнглийскийЯзык = ИСТИНА ТОГДА Номенклатура.НаименованиеАнгл 
        ИНАЧЕ Номенклатура.Наименование 
    КОНЕЦ КАК НаименованиеДляПечати
    
  2. Регистр сведений "Интернациональные названия": Создаем регистр с измерениями Объект (ЛюбаяСсылка) и Язык (Код языка), и ресурсом Значение (Строка). В отчете соединяем основную таблицу с этим регистром по левому соединению, фильтруя по нужному языку.

Метод 5. Пост-обработка сформированного документа

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


Процедура ПеревестиТабличныйДокумент(ТабДок)
    Словарь = Новый Соответствие;
    Словарь.Вставить("Итого", "Total");
    Словарь.Вставить("Период", "Period");
    Словарь.Вставить("Склад", "Warehouse");
    
    Для Ряд = 1 По ТабДок.ВысотаТаблицы Цикл
        Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
            ТекстЯчейки = ТабДок.Область(Ряд, Кол).Текст;
            Если Словарь[ТекстЯчейки] <> Неопределено Тогда
                ТабДок.Область(Ряд, Кол).Текст = Словарь[ТекстЯчейки];
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Заключение: Наиболее надежным и профессиональным подходом для платформы 1С 8.3 является сочетание Метода 1 (использование синонимов в СКД) и Метода 3 (запуск через фоновое задание для корректной локализации форматов дат и чисел). Это позволит Маринке формировать отчеты для финского коллеги простым нажатием галочки, не покидая свой привычный сеанс.

← На главную