Как убрать лишние угловые скобки <> при выводе макета на печать в 1С?

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

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

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

Анализ исходной ситуации и программного кода

Типичный сценарий возникновения проблемы выглядит следующим образом. Разработчик подготавливает макет, содержащий область с текстовым шаблоном. Например, в ячейке прописан текст:

ИИН [КлиентИИН]

Для свойства ячейки «Заполнение» установлено значение Шаблон. При выводе этой области через программный код значения параметров заполняются, но на печати пользователь видит некорректную строку: <ИИН 89781311212>.

Давайте проанализируем стандартный код формирования и вывода такого табличного документа:


ФормаПечати = ПолучитьФорму("ФормаПечати");
ТабДок = ФормаПечати.ЭлементыФормы.TabularDocument; // Элемент управления на форме

ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСлева = 10; 
ТабДок.ПолеСправа = 10;            
ТабДок.ПолеСнизу = 10;
ТабДок.ОтображатьСетку = Истина;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.АвтоМасштаб = Истина;

Макет = Справочники.Договора.ПолучитьМакет("Печать2020");
 
мРеквизиты = Макет.ПолучитьОбласть("ДоговорРеквизиты");
мРеквизиты.Параметры.КлиентИИН = Клиент.ИдентификационныйКодЛичности;

ТабДок.Вывести(мРеквизиты);

ФормаПечати.Открыть();
ФормаПечати.Высота = 550;
ФормаПечати.Ширина = 770;

С точки зрения синтаксиса встроенного языка код написан абсолютно верно. Метод ПолучитьОбласть() загружает нужную часть макета, свойству Параметры присваивается корректное строковое или числовое значение, а метод Вывести() добавляет область в итоговый табличный документ. Следовательно, корень проблемы кроется не в кодовой базе, а в свойствах и внутренней структуре самого макета (файла с расширением .mxl).

Ниже приведены подробные инструкции по устранению этой неполадки.

Решение 1. Сброс метаданных заполнения ячеек (Основной метод)

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

Для устранения этого сбоя выполним следующие шаги:

  1. Откроем проблемный макет в Конфигураторе 1С.
  2. Выделим полностью всю рабочую область макета (можно нажать комбинацию клавиш Ctrl + A) или выделим только те строки и столбцы, в которых наблюдается дефект.
  3. Откроем палитру свойств выделенных ячеек (клавиша F4).
  4. Найдем свойство Заполнение (Fill) и принудительно установим его в значение Текст (Text). Обратите внимание: все маркеры параметров исчезнут, и текст станет простым статическим содержимым.
  5. Сохраним конфигурацию.
  6. Теперь точечно пройдемся по тем ячейкам, которые действительно должны быть динамическими. Выделим нужную ячейку, откроем ее свойства и вернем значение свойства Заполнение в положение Шаблон (Template) или Параметр (Parameter) в зависимости от исходной логики макета.

Этот простой цикл переключения свойств полностью перезаписывает XML-описание ячеек в базе данных конфигурации, очищая устаревшие и конфликтующие дескрипторы свойств.

Решение 2. Устранение ручного ввода угловых скобок

Очень часто начинающие разработчики путают правила оформления ячеек в Конфигураторе. Видя, что платформа отображает параметры в виде <ИИН>, они пытаются вручную написать эти угловые скобки прямо в поле ввода текста ячейки, а уже после этого меняют тип заполнения на «Параметр».

Выясним, к чему это приводит: платформа начинает воспринимать символы < и > как часть строкового литерала, которую пользователь ввел умышленно. При выводе на печать значение параметра подставляется внутрь, но внешние символы скобок никуда не исчезают.

Правильный алгоритм действий:

  1. Очистим текст в ячейке макета. Он должен быть абсолютно чистым (например, просто слово КлиентИИН без каких-либо скобок по бокам).
  2. В палитре свойств установим для этой ячейки тип заполнения Параметр.
  3. Убедимся, что платформа сама автоматически выделила слово угловыми скобками в окне редактора макета.
  4. Если мы используем тип заполнения Шаблон, то параметры внутри текста обязательно должны оборачиваться в квадратные скобки: ИИН [КлиентИИН]. Никаких угловых скобок вручную ставить не нужно!

Решение 3. Полное пересоздание строк или колонок

Если сброс свойств ячеек в «Текст» не помог, это свидетельствует о глубоком повреждении структуры табличного документа на уровне конкретных строк или колонок. В этом случае обычное копирование ячеек через Ctrl + C и Ctrl + V не даст результатов, так как вместе с ячейками скопируются и поврежденные XML-атрибуты.

Выполним кардинальное очищение проблемной зоны:

  1. Выделим строки макета, в которых выводятся лишние символы <>.
  2. Нажмем правую кнопку мыши и выберем пункт Удалить (строки должны быть удалены физически, а не просто очищены клавишей Delete).
  3. Добавим новые чистые строки в макет.
  4. Заново настроим текстовое оформление, границы и свойства параметров в добавленных строках.

Решение 4. Отключение свойства «Содержит значение»

Еще одной неочевидной причиной конфликта рендеринга является случайно установленный флаг типизации ячейки. В палитре свойств ячеек табличного документа присутствует логический флаг Содержит значение (Contains Value).

Если для ячейки с типом заполнения «Шаблон» или «Параметр» данный флаг установлен в значение Истина, движок печати 1С пытается обработать ячейку как поле ввода значения определенного типа (например, ссылки на справочник Контрагенты). Из-за этого текстовый шаблон не может корректно интерпретироваться, и платформа выводит системное представление ячейки в угловых скобках.

Для исправления ситуации выделим проблемные ячейки макета, перейдем в палитру свойств и убедимся, что флаг Содержит значение установлен в положение Ложь (снят).

Решение 5. Корректная настройка системных колонтитулов

Как отмечалось в обсуждении проблемы, угловые скобки могут появляться и в колонтитулах макета (например, в виде <1/7>). Попытка сымитировать нижний или верхний колонтитул путем создания обычной строки внизу макета с типом заполнения «Шаблон» приводит к ошибкам рендеринга спецсимволов страниц.

Для вывода номеров страниц и общего количества листов без сбоев и лишних символов необходимо использовать исключительно штатные свойства объекта ТабличныйДокумент в коде встроенного языка. Рассмотрим пример правильной настройки колонтитулов:


// Включаем отображение нижнего колонтитула
ТабДок.НижнийКолонтитул.Выводить = Истина;

// Задаем системный шаблон для вывода номеров страниц в правой части
ТабДок.НижнийКолонтитул.ТекстСправа = "[&Страница] из [&Страниц]";

// Настраиваем шрифт и размер колонтитула при необходимости
ТабДок.НижнийКолонтитул.Шрифт = Новый Шрифт("Arial", 9, Ложь, Ложь);

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

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

← На главную