В конфигурациях с поддержкой многоязычности, таких как 1С:ERP World Edition (ERP WE), часто возникает задача: пользователь с русскоязычным интерфейсом должен оперативно сформировать и выгрузить отчет на английском или любом другом языке без перезапуска системы. Для печатных форм документов платформа 1С предоставляет отработанные механизмы, где можно прямо указать параметр КодЯзыка макета. Однако при попытке проделать аналогичное действие с отчетами разработчики сталкиваются с серьезными трудностями.
Разберем, почему стандартные механизмы отчетов ведут себя иначе, какие системные ограничения накладывает платформа 1С, и подробно рассмотрим практические способы решения этой задачи.
Проанализируем архитектуру системы компоновки данных (СКД). В отличие от объекта ТабличныйДокумент, у объектов СКД (СхемаКомпоновкиДанных, КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных) нет прямого свойства вроде КодЯзыка, позволяющего динамически переключить контекст формирования.
Когда выполняется компоновка макета, платформа автоматически опирается на язык текущего сеанса пользователя. Это приводит к следующим системным ограничениям:
ПРЕДСТАВЛЕНИЕ(...), форматирование дат, стандартные периоды и системные перечисления генерируются платформой строго на языке текущего сеанса.КодЯзыкаМакета: Данное свойство существует у табличного документа, но оно используется при ручном выводе областей многоязычных табличных макетов. На внутренние алгоритмы СКД оно не оказывает никакого влияния.Язык сеанса пользователя зафиксирован при старте программы, и поменять его «на лету» без перезапуска клиентского приложения штатно невозможно. Поэтому для решения задачи требуется программное вмешательство.
Рассмотрим первый подход, который позволяет получить отчет на требуемом языке внутри текущего русскоязычного сеанса путем модификации схемы компоновки данных в оперативной памяти.
Схема компоновки данных выгружается перед компоновкой макета. Мы программно обходим ее элементы и принудительно переопределяем заголовки полей, группировок и ресурсов, извлекая нужную языковую строку с помощью функции НСтр().
Посмотрим на пример процедуры модификации заголовков полей схемы:
Процедура ПеревестиЗаголовкиПолейСКД(СхемаСКД, КодЯзыка) Экспорт
Для Каждого НаборДанных Из СхемаСКД.НаборыДанных Цикл
Для Каждого Поле Из НаборДанных.Поля Цикл
Если ЗначениеЗаполнено(Поле.Заголовок) Тогда
Поле.Заголовок = НСтр(Поле.Заголовок, КодЯзыка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Однако перевод заголовков решает задачу лишь частично. В ERP WE мультиязычные наименования справочников (например, номенклатуры, контрагентов, статей расходов) хранятся в отдельных реквизитах или специализированных регистрах сведений подсистемы мультиязычности БСП. Если просто сформировать отчет, данные строк останутся на русском языке, так как поле Ссылка.Наименование вернет русское значение.
Чтобы обойти это, разберем по шагам доработку набора данных:
НаименованиеАнгл) либо соединяем запрос с регистром сведений мультиязычных строк.Если требуется сформировать стандартный типовой отчет полностью на английском языке без масштабной ручной переработки его СКД, оптимальным решением является вызов дополнительного сеанса с явным указанием языка.
Выясним механизм реализации: мы инициируем COM-соединение к текущей базе данных, но в строке подключения принудительно передаем языковые параметры запуска L=en;VL=en;.
Посмотрим на пример программного кода:
Функция СформироватьОтчетВДругомЯзыкеCOM(ИмяОтчета, ПараметрыОтчета, КодЯзыка) Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
COMКоннектор = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = СтрокаСоединения + ";L=" + КодЯзыка + ";VL=" + КодЯзыка + ";";
Попытка
Соединение = COMКоннектор.Connect(ПараметрыПодключения);
Исключение
ВызватьИсключение "Не удалось установить соединение: " + ОписаниеОшибки();
КонецПопытки;
// Формируем отчет внутри контекста англоязычного сеанса
ОбъектОтчета = Соединение.Отчеты[ИмяОтчета].Создать();
ТабличныйДокументCOM = Соединение.НовыйОбъект("ТабличныйДокумент");
// Здесь вызывается штатная процедура формирования отчета
ОбъектОтчета.СкомпоноватьРезультат(ТабличныйДокументCOM);
// Передаем сформированный документ обратно в текущий сеанс через временный файл
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("mxl");
ТабличныйДокументCOM.Записать(ИмяВременногоФайла);
Результат = Новый ТабличныйДокумент;
Результат.Прочитать(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
Возврат Результат;
КонецФункции
В таком варианте платформа автоматически применит англоязычные синонимы СКД, корректно отработает системные представления, периоды и перечисления, не требуя модификации схемы компоновки данных.
COM-соединение имеет ограничения: оно зависит от операционной системы Windows и платформенных библиотек. Если информационная база работает на Linux или в облачной инфраструктуре, лучшей альтернативой становится HTTP-сервис.
Разберем по шагам создание такого механизма:
HTTP-сервис, принимающий имя отчета и его настройки.en.ТабличныйДокумент, сериализует его в двоичные данные и возвращает в теле ответа.Если задача стоит в получении управленческой, финансовой отчетности или отчетности по МСФО в рамках ERP WE, обратите внимание на встроенный «Генератор финансовых отчетов».
В справочнике Виды финансовых отчетов уже предусмотрена возможность ведения мультиязычных структур отчетов. Вы можете скопировать требуемый финансовый отчет и определить наименования колонок, строк и расчетных формул на иностранном языке (в типовой демонстрационной базе ERP WE для этого представлен предустановленный отчет Statement of Financial Position). Такой подход не требует программного переключения сеанса и реализуется стандартными пользовательскими настройками.