Почему при заполнении шаблона docx в 1С вместо переноса строки появляются квадратики?

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

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

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

Суть проблемы: различия архитектуры .doc и .docx

Чтобы понять, как исправить ошибку, нам нужно сначала выяснить ее причину. Когда мы сохраняем файл как .doc, мы работаем с бинарным форматом, который достаточно лояльно относится к различным управляющим символам. Символ переноса строки Символы.ПС (код 10), который 1С добавляет в строку, интерпретировался старым Word как команда «перейти на новую строку».

Формат .docx — это совершенно другая история. Это архив, внутри которого лежат XML-файлы. Весь текст хранится внутри узлов XML. Стандарт OpenXML, на котором базируется .docx, воспринимает текст внутри тегов <w:t> буквально. Символ с кодом 10 (Line Feed), который мы передаем из 1С, для Word внутри XML-структуры не является командой форматирования. Word видит его как неизвестный символ, для которого в текущем шрифте нет графического отображения (глифа). Именно отсутствие картинки для символа программа отображает как пустой квадрат.

Рассмотрим несколько методов, которые помогут нам научить 1С и Word снова понимать друг друга.

Способ 1. Замена символа переноса (Самый быстрый)

Чаще всего проблема решается заменой привычного нам Символы.ПС на другой управляющий символ — Возврат Каретки (Carriage Return).

В кодировке ASCII и Unicode символ перевода строки (Line Feed) имеет код 10, а возврат каретки — код 13. Word в формате .docx гораздо лучше воспринимает именно код 13 как сигнал к завершению абзаца при простой вставке текста.

Попробуем изменить код формирования строки. Вместо накопления через Символы.ПС, используем Символы.ВК.

Пример кода до исправления:


РезультатОбработки = "" + РезультатОбработки + Символы.ПС 
+ РезультатОбработкиДолжность;

Пример кода с исправлением:


// Используем Возврат Каретки (код 13)
РезультатОбработки = "" + РезультатОбработки + Символы.ВК 
+ РезультатОбработкиДолжность;

// Или, если строка уже сформирована, делаем замену перед вставкой:
Результат = СтрЗаменить(ИсходныйТекст, Символы.ПС, Символы.ВК);

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

Способ 2. Мягкий перенос строки (Shift+Enter)

Иногда нам не нужно создавать новый абзац (с отступами и интервалами), а нужно просто перенести текст на новую строку в рамках текущего абзаца. В Word это делается сочетанием клавиш Shift+Enter.

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

Давайте посмотрим, как это применить:


// Используем вертикальную табуляцию для мягкого переноса
АдресПолный = Город + Символы.ВТаб + Улица + Символы.ВТаб + Дом;

Способ 3. Работа с XML-тегами (Для продвинутых случаев)

Если мы формируем структуру документа на низком уровне или используем прямую инъекцию в XML-код документа, то правильным способом переноса является использование специального тега <w:br/>.

Однако здесь есть важный нюанс. Если мы просто напишем этот тег в строке 1С и передадим его в параметр замены стандартной подсистемы (например, БСП в Документообороте), то система может экранировать спецсимволы.

Это значит, что вместо разрыва строки вы увидите в документе текст:

<w:br/>

Это происходит потому, что механизмы 1С превращают < в &lt;, чтобы не сломать структуру файла. Поэтому данный метод работает только если вы используете свои механизмы заполнения, которые вставляют «сырой» XML, или если библиотека 1С позволяет передавать неэкранированные данные.

Способ 4. Особенности 1С:Документооборота и БСП

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

Давайте проанализируем, как эти механизмы работают с многострочным текстом. Зачастую функции заполнения Word-макетов при помощи БСП умеют принимать не только строку, но и Массив строк.

Если мы передаем строку с разделителями, система пытается вставить её как единый кусок текста. Если же мы передадим массив, система сама обойдет его элементы и корректно вставит необходимые разрывы абзацев (теги <w:p> или <w:br/>) между ними. Кстати, если стандартного функционала мало, и требуется, например, вставка QR-кода в файлы doc и docx, используются похожие принципы работы с объектной моделью документа.

Рекомендуемый подход для БСП:


// Вместо склеивания строки создадим массив
ДанныеДляПечати = Новый Массив;
Если ЗначениеЗаполнено(Должность) Тогда
    ДанныеДляПечати.Добавить(Должность);
КонецЕсли;
Если ЗначениеЗаполнено(Получатель) Тогда
    ДанныеДляПечати.Добавить(Получатель);
КонецЕсли;

// Передаем массив в параметры заполнения
// (Синтаксис зависит от версии вашей подсистемы печати)
ПараметрыЗаполнения.Вставить("MyTextField", ДанныеДляПечати);

Способ 5. Настройка самого шаблона Word

Иногда проблема кроется не в коде 1С, а в настройках полей внутри файла .docx. Если вы используете «Элементы управления содержимым» (Content Controls) — это такие серые поля, куда вставляются данные, — у них есть свойства.

Проверим настройки шаблона:

  1. Откройте шаблон в Word.
  2. Перейдите на вкладку «Разработчик» (если её нет, включите в настройках ленты).
  3. Выделите поле, в которое вставляется многострочный текст.
  4. Нажмите кнопку «Свойства» (Properties).
  5. Найдите галочку «Разрешить возврат каретки» (Allow carriage returns).

Если эта опция выключена, Word будет принудительно схлопывать строки или отображать символы переноса как непечатные (те самые квадратики), так как поле считается однострочным.

Резюме

Для устранения «квадратиков» при заполнении .docx шаблонов выполним следующие шаги в порядке приоритета:

  1. Заменим в коде Символы.ПС на Символы.ВК (код 13). Это помогает в 80% случаев.
  2. Если нужны мягкие переносы, используем Символы.ВТаб (код 11).
  3. Проверим настройки Content Control в шаблоне Word — включена ли поддержка возврата каретки.
  4. Если используется БСП/Документооборот — попробуем передавать данные не строкой с разделителями, а массивом строк.

Используя эти методы, мы обеспечим корректное формирование документов вне зависимости от их формата — готовым примером автоматизации является печать трудовых договоров по шаблонам Word из 1С.

← На главную