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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

---

Метод 1. Использование раздельных макетов таблиц через ИсходнаяТаблица()

Этот способ является наиболее популярным среди разработчиков благодаря своей простоте и гибкости верстки. Мы создаем в конфигураторе внутри одного отчета или обработки две (или более) абсолютно независимые таблицы-шаблона. Например, даем им идентификаторы Таблица_RU и Таблица_EN.

Перед выводом документа на печать программа проверяет выбранный пользователем язык интерфейса или специальный флаг в форме и подключает нужный макет с помощью встроенного метода ИсходнаяТаблица() (или англоязычного аналога SourceTable()).

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


Процедура Печать(ЯзыкПечати = "RU")
    Таб = СоздатьОбъект("Таблица");
    
    // Выбираем макет в зависимости от выбранного языка
    Если ВРег(ЯзыкПечати) = "EN" Тогда
        Таб.ИсходнаяТаблица("Таблица_EN");
    Иначе
        Таб.ИсходнаяТаблица("Таблица_RU");
    КонецЕсли;
    
    // Выводим стандартные секции макета
    Таб.ВывестиСекцию("Шапка");
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Таб.ВывестиСекцию("Строка");
    КонецЦикла;
    
    Таб.ВывестиСекцию("Подвал");
    
    // Отображаем готовую форму пользователю
    Таб.Опции(0, 0, 0, 0);
    Таб.Показать("Печать документа / Print Document", "");
КонецПроцедуры

Преимущества метода:

  1. Простота локализации интерфейса: верстка подстраивается индивидуально. Английские фразы часто длиннее русских, и в отдельном макете можно расширить ячейки, изменить высоту строк или шрифт, не нарушая дизайн русской версии.
  2. Удобство перевода: готовый макет можно сохранить в формате XLS/MXL и передать профессиональному переводчику. Переводчику не придется разбираться в коде программных модулей.

Недостатки метода:

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

---

Метод 2. Универсальный макет с заполнением через выражения

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

Разберем, как спроектировать функцию-переводчик в глобальном модуле или модуле самого отчета:


Функция глПеревестиСтроку(ТекстДляПеревода, Язык) Экспорт
    // Если выбран русский язык, возвращаем исходную строку
    Если ВРег(Язык) = "RU" Тогда
        Возврат ТекстДляПеревода;
    КонецЕсли;
    
    // Простейший словарь соответствий для английского языка
    Если ВРег(Язык) = "EN" Тогда
        Если ТекстДляПеревода = "Накладная" Тогда Возврат "Invoice";
        ИначеЕсли ТекстДляПеревода = "Количество" Тогда Возврат "Quantity";
        ИначеЕсли ТекстДляПеревода = "Цена" Тогда Возврат "Price";
        ИначеЕсли ТекстДляПеревода = "Сумма" Тогда Возврат "Amount";
        ИначеЕсли ТекстДляПеревода = "Итого" Тогда Возврат "Total";
        ИначеЕсли ТекстДляПеревода = "Дата" Тогда Возврат "Date";
        КонецЕсли;
    КонецЕсли;
    
    // Если перевод не найден, возвращаем исходный текст
    Возврат ТекстДляПеревода;
КонецФункции

В ячейках макета вместо текста пишется выражение вида: глПеревестиСтроку("Накладная", КонтекстПечати.Язык).

Преимущества метода:

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

Недостатки метода:

  1. Ячейки перегружаются длинными формулами, что затрудняет чтение макета в конфигураторе.
  2. Невозможно индивидуально подогнать ширину колонок под специфику длинных слов конкретного языка.

---

Решение проблемы перевода динамических данных справочников

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

  1. Внедрение дополнительных реквизитов (рекомендуется): В метаданные справочника (например, «Номенклатура») добавляется текстовый реквизит НаименованиеАнгл. При выводе строки в печатную форму проверяется условие:
    
    ПечНоменклатура = ИсходныйТовар.Наименование;
    Если НуженАнглийский = 1 Тогда
        Если ПустаяСтрока(ИсходныйТовар.НаименованиеАнгл) = 0 Тогда
            ПечНоменклатура = ИсходныйТовар.НаименованиеАнгл;
        КонецЕсли;
    КонецЕсли;
    
  2. Разделение наименования спецсимволом (без изменения структуры БД): Если конфигурацию нельзя изменять (она типовая и стоит на поддержке), перевод вносят в стандартное наименование через разделитель. Например: "Шоколад Аленка | 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 с помощью внешних библиотек-компонент.

← На главную