В практике разработчика 1С иногда возникает загадочная ситуация: вы тщательно отрисовали макет табличного документа, расставили заголовки, подписи и рамки. Однако при выводе на печать происходит странное — все данные, которые передаются как Параметры, отображаются корректно, а обычный статический Текст в ячейках просто пропадает, оставляя форму «лысой». Давайте разберем по шагам, почему это происходит и как исправить эту ошибку.
Для начала проанализируем, как ведет себя система. В свойствах ячейки макета для типа заполнения «Текст» (Fill Type) информация внесена, но в результирующем табличном документе эти ячейки выглядят пустыми. При этом параметры (например, НомерДокумента или Дата), которые мы заполняем через Область.Параметры.Заполнить(), выводятся без проблем.
Выясним причину такого поведения. Платформа 1С:Предприятие 8 поддерживает многоязычность макетов. Это означает, что для каждой текстовой ячейки можно хранить разные варианты строк для разных языков (русский, английский и т.д.). Когда мы программно или через настройки системы указываем определенный язык для формирования печатной формы, 1С пытается найти текст именно для этого языка. Если поле для данного языка в макете не заполнено, система выводит пустоту.
Ключевым моментом в данной проблеме является свойство КодЯзыкаМакета (LanguageCode) объекта ТабличныйДокумент или самого макета. Посмотрим на пример кода, который часто становится причиной «исчезновения» текста:
КодЯзыкаПечать = Локализация.ПолучитьЯзыкФормированияПечатныхФорм(УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "РежимФормированияПечатныхФорм"));
Макет.КодЯзыкаМакета = КодЯзыкаПечать;
Разберем, что здесь происходит. Программа пытается определить предпочтительный язык печати для текущего пользователя. Если у пользователя в настройках стоит, например, английский язык или код языка, который не совпадает с основным языком разработки, и этот код присваивается свойству КодЯзыкаМакета, то 1С переключает контекст отображения макета. Если в самом макете текстовые значения прописаны только для русского языка, то при переключении на другой код языка все статические надписи «исчезнут».
Рассмотрим разницу между заполнением типа Текст и Параметр. Это поможет понять логику работы платформы:
Область.Параметры.Сумма = Итог;, платформе не важно, какой язык установлен. Она просто берет значение переменной и помещает его в ячейку.Именно поэтому параметры «выживают», а заголовки — нет. Если же ваш параметр должен содержать локализованную строку (например, слово «Итого»), то за его перевод отвечает разработчик, используя функцию НСтр() в программном коде.
Проанализируем ситуацию в редакторе макета. Если в вашей конфигурации задано несколько языков, в нижней части окна макета или в его свойствах появляется возможность управления языками. Чтобы избежать пустот, выполним следующие действия:
КодЯзыкаМакета в значение, отличное от того, на котором создан макет.Если вам все же необходимо программно управлять языком, стоит добавить проверку на наличие перевода или использовать универсальный подход. Рассмотрим более безопасный вариант установки языка:
// Проверим, не пустой ли код языка получен из настроек
Если ЗначениеЗаполнено(КодЯзыкаПечать) Тогда
// Устанавливаем язык только если уверены, что макет его поддерживает
Попытка
Макет.КодЯзыкаМакета = КодЯзыкаПечать;
Исключение
// Обработка ошибки, если код языка не поддерживается
КонецПопытки;
КонецЕсли;
Также важно помнить о региональных установках операционной системы. Метод Локализация.ПолучитьЯзыкФормированияПечатныхФорм может возвращать данные на основе системных настроек Windows (например, «en_US»). Если в макете 1С предусмотрен только язык «ru», возникнет описанный конфликт.
Подведем итог нашему разбору. «Странное» поведение табличной формы — это не баг платформы, а штатная работа механизма интернационализации. Чтобы в будущем не сталкиваться с подобным, рекомендуем придерживаться следующих правил:
КодЯзыкаМакета в коде формирования печати.НСтр("ru='Сумма'; en='Amount'").Следуя этим простым шагам, вы обеспечите стабильную работу печатных форм в любых условиях и для любых пользователей вашей системы.