Разработка мультиязычных печатных форм — стандартная задача при автоматизации компаний, ведущих внешнеэкономическую деятельность или имеющих иностранных учредителей. Если в современных версиях платформы 1С:Предприятие 8.х для этого предусмотрены штатные инструменты локализации макетов и подсистемы БСП, то в «семерке» (1С:Предприятие 7.7) разработчикам приходится решать этот вопрос вручную.
В этой статье мы подробно проанализируем архитектурные подходы к реализации печатных форм на нескольких языках (на примере русского и английского) в 1С 7.7, разберем достоинства и недостатки каждого метода, а также приведем готовые примеры кода для работы с датами, суммами прописью и справочниками.
---
Этот способ является наиболее популярным среди разработчиков благодаря своей простоте и гибкости верстки. Мы создаем в конфигураторе внутри одного отчета или обработки две (или более) абсолютно независимые таблицы-шаблона. Например, даем им идентификаторы Таблица_RU и Таблица_EN.
Перед выводом документа на печать программа проверяет выбранный пользователем язык интерфейса или специальный флаг в форме и подключает нужный макет с помощью встроенного метода ИсходнаяТаблица() (или англоязычного аналога SourceTable()).
Рассмотрим пример реализации в коде модуля:
Процедура Печать(ЯзыкПечати = "RU")
Таб = СоздатьОбъект("Таблица");
// Выбираем макет в зависимости от выбранного языка
Если ВРег(ЯзыкПечати) = "EN" Тогда
Таб.ИсходнаяТаблица("Таблица_EN");
Иначе
Таб.ИсходнаяТаблица("Таблица_RU");
КонецЕсли;
// Выводим стандартные секции макета
Таб.ВывестиСекцию("Шапка");
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
// Отображаем готовую форму пользователю
Таб.Опции(0, 0, 0, 0);
Таб.Показать("Печать документа / Print Document", "");
КонецПроцедуры
Преимущества метода:
Недостатки метода:
---
Этот подход базируется на концепции единого шаблона печатной формы. В макете создается только одна таблица, но все текстовые ячейки переводятся в тип «Выражение». Вместо статического текста (например, «Итого») в свойствах ячейки прописывается вызов функции перевода, принимающей идентификатор строки и код языка.
Разберем, как спроектировать функцию-переводчик в глобальном модуле или модуле самого отчета:
Функция глПеревестиСтроку(ТекстДляПеревода, Язык) Экспорт
// Если выбран русский язык, возвращаем исходную строку
Если ВРег(Язык) = "RU" Тогда
Возврат ТекстДляПеревода;
КонецЕсли;
// Простейший словарь соответствий для английского языка
Если ВРег(Язык) = "EN" Тогда
Если ТекстДляПеревода = "Накладная" Тогда Возврат "Invoice";
ИначеЕсли ТекстДляПеревода = "Количество" Тогда Возврат "Quantity";
ИначеЕсли ТекстДляПеревода = "Цена" Тогда Возврат "Price";
ИначеЕсли ТекстДляПеревода = "Сумма" Тогда Возврат "Amount";
ИначеЕсли ТекстДляПеревода = "Итого" Тогда Возврат "Total";
ИначеЕсли ТекстДляПеревода = "Дата" Тогда Возврат "Date";
КонецЕсли;
КонецЕсли;
// Если перевод не найден, возвращаем исходный текст
Возврат ТекстДляПеревода;
КонецФункции
В ячейках макета вместо текста пишется выражение вида: глПеревестиСтроку("Накладная", КонтекстПечати.Язык).
Преимущества метода:
глПеревестиСтроку(), не прикасаясь к визуальному оформлению.Недостатки метода:
---
Даже если макет печатной формы полностью переведен, названия номенклатуры, единиц измерения и контрагентов берутся непосредственно из базы данных. Выясним, как организовать хранение двуязычных наименований элементов справочников в 1С 7.7:
НаименованиеАнгл. При выводе строки в печатную форму проверяется условие:
ПечНоменклатура = ИсходныйТовар.Наименование;
Если НуженАнглийский = 1 Тогда
Если ПустаяСтрока(ИсходныйТовар.НаименованиеАнгл) = 0 Тогда
ПечНоменклатура = ИсходныйТовар.НаименованиеАнгл;
КонецЕсли;
КонецЕсли;
"Шоколад Аленка | Chocolate Alyonka". В коде печати строку парсят программно:
Функция глПолучитьЛокализованноеИмя(СтрокаНаименования, Язык) Экспорт
ПозРазделителя = Найти(СтрокаНаименования, "|");
Если ПозРазделителя > 0 Тогда
Если ВРег(Язык) = "EN" Тогда
Возврат СокрЛП(Сред(СтрокаНаименования, ПозРазделителя + 1));
Иначе
Возврат СокрЛП(Лев(СтрокаНаименования, ПозРазделителя - 1));
КонецЕсли;
КонецЕсли;
Возврат СтрокаНаименования; // Возвращаем как есть, если разделителя нет
КонецФункции
---
Поскольку в 1С 7.7 отсутствует возможность использовать расширенные настройки форматной строки локализации (как в старших версиях платформы), вывод названия месяца на английском языке реализуется через написание собственной функции перевода даты. Посмотрим на практический пример:
Функция глДатаНаАнглийском(Знач ВхДата) Экспорт
Если ПустаяСтрока(ВхДата) = 1 Тогда
Возврат "";
КонецЕсли;
СписокМесяцев = СоздатьОбъект("СписокЗначений");
СписокМесяцев.ДобавитьЗначение("January");
СписокМесяцев.ДобавитьЗначение("February");
СписокМесяцев.ДобавитьЗначение("March");
СписокМесяцев.ДобавитьЗначение("April");
СписокМесяцев.ДобавитьЗначение("May");
СписокМесяцев.ДобавитьЗначение("June");
СписокМесяцев.ДобавитьЗначение("July");
СписокМесяцев.ДобавитьЗначение("August");
СписокМесяцев.ДобавитьЗначение("September");
СписокМесяцев.ДобавитьЗначение("October");
СписокМесяцев.ДобавитьЗначение("November");
СписокМесяцев.ДобавитьЗначение("December");
НомерМесяца = ДатаМесяц(ВхДата);
ИмяМесяцаАнгл = СписокМесяцев.ПолучитьЗначение(НомерМесяца);
Возврат "" + ДатаЧисло(ВхДата) + " " + ИмяМесяцаАнгл + " " + ДатаГод(ВхДата);
КонецФункции
---
Для вывода сумм прописью на иностранных языках разработчики 1С 7.7 используют файлы прописей с расширением .spl. Файлы прописи для различных валют (включая английский доллар или евро) обычно поставляются вместе с конфигурациями или могут быть скачаны отдельно и сохранены в каталог базы данных.
Для активации англоязычной прописи перед форматированием числа используется метод Пропись():
// Включаем файл английской прописи (например, usd.spl или 1cue.spl)
Пропись("1cue.spl");
// Форматируем числовое поле
СуммаПрописью = Формат(ВсегоСумма, "Ч038.2.Д");
// Сбрасываем настройки прописи к системным (русским по умолчанию)
Пропись("");
Параметр "Д" в форматной строке сообщает системе, что число должно интерпретироваться как денежная сумма с копейками/центами.
---
При проектировании мультиязычных систем на базе 1С:Предприятия 7.7 важно учитывать следующее ограничение: платформа не работает с кодировкой Юникод (Unicode) напрямую. Конфигурация функционирует строго в системной кодовой странице операционной системы Windows (для русскоязычных версий это обычно ANSI/Windows-1251).
Это накладывает жесткое ограничение: вы сможете легко сочетать в одном макете русский и английский языки, так как английские буквы входят в стандартную кодировку ASCII. Однако, если вам потребуется вывести в печатную форму азиатские иероглифы, арабскую вязь или греческий алфавит на русской версии Windows, 1С 7.7 выведет знаки вопроса или нечитаемые символы ("кракозябры").
Как решить проблему с кодировками (если нужен не только английский)?
Если вам требуется реализовать поддержку языков, выходящих за рамки кодовой страницы Windows-1251, стандартные табличные документы 1С 7.7 не подойдут. В этом случае мы рекомендуем отказаться от внутренних макетов и формировать печатные документы напрямую в Microsoft Excel или Word через механизм OLE/COM, либо генерировать файлы в кодировке UTF-8 с помощью внешних библиотек-компонент.