При разработке печатных форм в среде 1С:Предприятие программисты нередко сталкиваются с загадочным поведением платформы: при выводе табличного документа на экран или печать вокруг заполненных параметров или шаблонов внезапно появляются угловые скобки вида <ЗначениеПараметра>. Самое неприятное в этой ситуации то, что эти скобки (в конфигураторе являющиеся лишь визуальными маркерами свойств ячейки) «пролезают» в финальный документ и выводятся на бумагу.
В этой статье мы подробно разберем природу этого бага, проанализируем пример кода вывода печатной формы и рассмотрим пять проверенных практических способов решения данной проблемы.
Типичный сценарий возникновения проблемы выглядит следующим образом. Разработчик подготавливает макет, содержащий область с текстовым шаблоном. Например, в ячейке прописан текст:
ИИН [КлиентИИН]
Для свойства ячейки «Заполнение» установлено значение Шаблон. При выводе этой области через программный код значения параметров заполняются, но на печати пользователь видит некорректную строку: <ИИН 89781311212>.
Давайте проанализируем стандартный код формирования и вывода такого табличного документа:
ФормаПечати = ПолучитьФорму("ФормаПечати");
ТабДок = ФормаПечати.ЭлементыФормы.TabularDocument; // Элемент управления на форме
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.ОтображатьСетку = Истина;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.АвтоМасштаб = Истина;
Макет = Справочники.Договора.ПолучитьМакет("Печать2020");
мРеквизиты = Макет.ПолучитьОбласть("ДоговорРеквизиты");
мРеквизиты.Параметры.КлиентИИН = Клиент.ИдентификационныйКодЛичности;
ТабДок.Вывести(мРеквизиты);
ФормаПечати.Открыть();
ФормаПечати.Высота = 550;
ФормаПечати.Ширина = 770;
С точки зрения синтаксиса встроенного языка код написан абсолютно верно. Метод ПолучитьОбласть() загружает нужную часть макета, свойству Параметры присваивается корректное строковое или числовое значение, а метод Вывести() добавляет область в итоговый табличный документ. Следовательно, корень проблемы кроется не в кодовой базе, а в свойствах и внутренней структуре самого макета (файла с расширением .mxl).
Ниже приведены подробные инструкции по устранению этой неполадки.
Чаще всего появление скобок вызвано внутренним сбоем XML-структуры табличного документа. Это происходит, когда макет многократно редактировался, переносился между разными версиями платформ или создавался путем копирования элементов из других конфигураций. Платформа теряет корректную связь между текстовым содержимым и флагом типа заполнения ячейки.
Для устранения этого сбоя выполним следующие шаги:
Ctrl + A) или выделим только те строки и столбцы, в которых наблюдается дефект.F4).Этот простой цикл переключения свойств полностью перезаписывает XML-описание ячеек в базе данных конфигурации, очищая устаревшие и конфликтующие дескрипторы свойств.
Очень часто начинающие разработчики путают правила оформления ячеек в Конфигураторе. Видя, что платформа отображает параметры в виде <ИИН>, они пытаются вручную написать эти угловые скобки прямо в поле ввода текста ячейки, а уже после этого меняют тип заполнения на «Параметр».
Выясним, к чему это приводит: платформа начинает воспринимать символы < и > как часть строкового литерала, которую пользователь ввел умышленно. При выводе на печать значение параметра подставляется внутрь, но внешние символы скобок никуда не исчезают.
Правильный алгоритм действий:
КлиентИИН без каких-либо скобок по бокам).ИИН [КлиентИИН]. Никаких угловых скобок вручную ставить не нужно!Если сброс свойств ячеек в «Текст» не помог, это свидетельствует о глубоком повреждении структуры табличного документа на уровне конкретных строк или колонок. В этом случае обычное копирование ячеек через Ctrl + C и Ctrl + V не даст результатов, так как вместе с ячейками скопируются и поврежденные XML-атрибуты.
Выполним кардинальное очищение проблемной зоны:
<>.Еще одной неочевидной причиной конфликта рендеринга является случайно установленный флаг типизации ячейки. В палитре свойств ячеек табличного документа присутствует логический флаг Содержит значение (Contains Value).
Если для ячейки с типом заполнения «Шаблон» или «Параметр» данный флаг установлен в значение Истина, движок печати 1С пытается обработать ячейку как поле ввода значения определенного типа (например, ссылки на справочник Контрагенты). Из-за этого текстовый шаблон не может корректно интерпретироваться, и платформа выводит системное представление ячейки в угловых скобках.
Для исправления ситуации выделим проблемные ячейки макета, перейдем в палитру свойств и убедимся, что флаг Содержит значение установлен в положение Ложь (снят).
Как отмечалось в обсуждении проблемы, угловые скобки могут появляться и в колонтитулах макета (например, в виде <1/7>). Попытка сымитировать нижний или верхний колонтитул путем создания обычной строки внизу макета с типом заполнения «Шаблон» приводит к ошибкам рендеринга спецсимволов страниц.
Для вывода номеров страниц и общего количества листов без сбоев и лишних символов необходимо использовать исключительно штатные свойства объекта ТабличныйДокумент в коде встроенного языка. Рассмотрим пример правильной настройки колонтитулов:
// Включаем отображение нижнего колонтитула
ТабДок.НижнийКолонтитул.Выводить = Истина;
// Задаем системный шаблон для вывода номеров страниц в правой части
ТабДок.НижнийКолонтитул.ТекстСправа = "[&Страница] из [&Страниц]";
// Настраиваем шрифт и размер колонтитула при необходимости
ТабДок.НижнийКолонтитул.Шрифт = Новый Шрифт("Arial", 9, Ложь, Ложь);
При использовании встроенных конструкций вида [&Страница] платформа рассчитывает нумерацию динамически непосредственно перед выводом на печать (или в режиме предварительного просмотра), гарантируя отсутствие технических артефактов и скобок на бумаге.
Применяя предложенные методики, мы гарантированно избавимся от нежелательных символов в печатных формах 1С и обеспечим пользователям чистый и презентабельный вид документов.