Почему в печатной форме 1С отображаются только параметры, а статический текст исчезает?

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

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

Анализируем симптомы проблемы

Для начала проанализируем, как ведет себя система. В свойствах ячейки макета для типа заполнения «Текст» (Fill Type) информация внесена, но в результирующем табличном документе эти ячейки выглядят пустыми. При этом параметры (например, НомерДокумента или Дата), которые мы заполняем через Область.Параметры.Заполнить(), выводятся без проблем.

Выясним причину такого поведения. Платформа 1С:Предприятие 8 поддерживает многоязычность макетов. Это означает, что для каждой текстовой ячейки можно хранить разные варианты строк для разных языков (русский, английский и т.д.). Когда мы программно или через настройки системы указываем определенный язык для формирования печатной формы, 1С пытается найти текст именно для этого языка. Если поле для данного языка в макете не заполнено, система выводит пустоту.

Роль свойства КодЯзыкаМакета

Ключевым моментом в данной проблеме является свойство КодЯзыкаМакета (LanguageCode) объекта ТабличныйДокумент или самого макета. Посмотрим на пример кода, который часто становится причиной «исчезновения» текста:


КодЯзыкаПечать = Локализация.ПолучитьЯзыкФормированияПечатныхФорм(УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "РежимФормированияПечатныхФорм")); 
Макет.КодЯзыкаМакета = КодЯзыкаПечать;

Разберем, что здесь происходит. Программа пытается определить предпочтительный язык печати для текущего пользователя. Если у пользователя в настройках стоит, например, английский язык или код языка, который не совпадает с основным языком разработки, и этот код присваивается свойству КодЯзыкаМакета, то 1С переключает контекст отображения макета. Если в самом макете текстовые значения прописаны только для русского языка, то при переключении на другой код языка все статические надписи «исчезнут».

Почему параметры при этом продолжают работать?

Рассмотрим разницу между заполнением типа Текст и Параметр. Это поможет понять логику работы платформы:

  1. Тип «Текст»: Платформа берет готовую строку из ресурсов макета. Эти ресурсы жестко привязаны к языковым колонкам в конфигураторе. Нет перевода для выбранного языка — нет текста.
  2. Тип «Параметр»: Значение параметра вычисляется в коде. Когда вы пишете Область.Параметры.Сумма = Итог;, платформе не важно, какой язык установлен. Она просто берет значение переменной и помещает его в ячейку.

Именно поэтому параметры «выживают», а заголовки — нет. Если же ваш параметр должен содержать локализованную строку (например, слово «Итого»), то за его перевод отвечает разработчик, используя функцию НСтр() в программном коде.

Как исправить макет в конфигураторе

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

  1. Откроем макет табличного документа в конфигураторе.
  2. Проверим список языков конфигурации. Если их несколько, убедимся, что текст заполнен для каждого из них.
  3. Используем полезный инструмент: вызовем контекстное меню на ячейках и выберем пункт «Заполнить из другого языка». Это позволит быстро скопировать русский текст во все остальные языковые раскладки макета.
  4. Если многоязычность не требуется, убедимся, что в коде не происходит принудительной установки КодЯзыкаМакета в значение, отличное от того, на котором создан макет.

Программные способы решения

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


// Проверим, не пустой ли код языка получен из настроек
Если ЗначениеЗаполнено(КодЯзыкаПечать) Тогда
    // Устанавливаем язык только если уверены, что макет его поддерживает
    Попытка
        Макет.КодЯзыкаМакета = КодЯзыкаПечать;
    Исключение
        // Обработка ошибки, если код языка не поддерживается
    КонецПопытки;
КонецЕсли;

Также важно помнить о региональных установках операционной системы. Метод Локализация.ПолучитьЯзыкФормированияПечатныхФорм может возвращать данные на основе системных настроек Windows (например, «en_US»). Если в макете 1С предусмотрен только язык «ru», возникнет описанный конфликт.

Заключение и рекомендации

Подведем итог нашему разбору. «Странное» поведение табличной формы — это не баг платформы, а штатная работа механизма интернационализации. Чтобы в будущем не сталкиваться с подобным, рекомендуем придерживаться следующих правил:

  1. Проверяйте свойства ячеек: Если вы видите, что данные из параметров выводятся, а текст — нет, сразу проверяйте свойство КодЯзыкаМакета в коде формирования печати.
  2. Дублируйте тексты: При добавлении нового языка в конфигурацию обязательно проходите по всем макетам и заполняйте текстовые поля, даже если перевод пока не требуется (просто скопируйте основной язык).
  3. Используйте НСтр: Для параметров, которые должны менять текст в зависимости от языка, всегда используйте функцию НСтр("ru='Сумма'; en='Amount'").
  4. Тестируйте под разными пользователями: Проверяйте печать под пользователями с разными региональными настройками (Интерфейс, Страна), чтобы вовремя заметить отсутствие текстов.

Следуя этим простым шагам, вы обеспечите стабильную работу печатных форм в любых условиях и для любых пользователей вашей системы.

← На главную