Как исправить появление квадратиков вместо переноса строки при автозаполнении шаблонов DOCX в 1С?

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

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

В этой статье мы подробно разберем техническую суть проблемы, выясним, почему старый формат .doc работал корректно, а новый .docx дает сбой, и рассмотрим несколько вариантов решения: от доработки общего модуля конфигурации до изящного обходного пути без изменения метаданных (через XML-инъекцию).

Выясняем причину: почему появляются «квадратики»?

Для начала проанализируем структуру файлов. Старый формат .doc является двоичным файлом, в то время как современный формат .docx представляет собой обычный ZIP-архив, внутри которого находятся XML-файлы с разметкой. Весь текст документа хранится в файле word/document.xml.

В структуре Office OpenXML весь текст документа располагается строго внутри тегов <w:t>...</w:t> (от английского text). Согласно спецификации XML, стандартные управляющие символы переноса строки, такие как Символы.ПС (перевод строки, код 10) или Символ(13) (возврат каретки), внутри тега <w:t> не поддерживаются в качестве визуального разрыва. MS Word просто не знает, как их интерпретировать внутри текстового контейнера, и выводит системный глиф отсутствующего символа — тот самый «квадратик».

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

</w:t><w:br/><w:t>

Где тег <w:br/> как раз и дает команду процессору MS Word выполнить переход на новую строку.

Анализируем стандартный код 1С

Давайте посмотрим на то, как типовая конфигурация «1С:Документооборот» обрабатывает замену полей в шаблонах. За этот процесс отвечает общий модуль АвтозаполнениеШаблоновФайловКлиентСервер и конкретно процедура ВыполнитьЗаменуПолейИСтрокВДокументеMSOfficeOpenXML.

В устаревших релизах конфигурации разработчики жестко вырезали переносы строк, заменяя их на пустую строку, чтобы избежать ошибок разметки:

СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "");

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

Решение 1: Модернизация общего модуля (Требуется изменение кода)

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

Нам необходимо заменить логику очистки спецсимволов на корректное преобразование в теги разметки OpenXML. Существует два варианта замены в зависимости от ваших бизнес-требований.

Вариант А: «Мягкий» перенос (аналог сочетания клавиш Shift + Enter)

Этот вариант является наиболее предпочтительным, так как он просто осуществляет перевод каретки на новую строку, сохраняя текущий абзац. Он идеально подходит для списков внутри ячеек таблиц, так как не ломает границы строк и свойства абзацев таблицы. Замените стандартную строку очистки на следующий код:

СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "</w:t><w:br/><w:t>");

Вариант Б: «Жесткий» перенос (аналог клавиши Enter)

Этот вариант полностью закрывает текущий абзац Word (тег <w:p>) и открывает новый. Используйте его, если вам важно, чтобы между строками применялись отступы, заданные стилем абзаца в шаблоне:


СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "</w:t></w:r></w:p><w:p><w:r><w:t>");

Важный нюанс: Чтобы данный код отработал корректно и теги XML не вывелись на экран как обычный текст, запись итоговой строки в файл должна осуществляться через метод ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены). В противном случае платформа автоматически экранирует символы «меньше» и «больше», превратив их в безопасные сущности &lt; и &gt;.

Решение 2: XML-инъекция в скрипте автозаполнения (Без изменения конфигурации)

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

Давайте разберем по шагам, как устроен этот трюк:

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

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


РезультатОбработки = Символы.ПС + "Адрес: г. Москва" + "</w:t><w:br/><w:t>" + "Получатель: Иванов И.И." + Символы.ПС;

Как это работает под капотом платформы?

Когда типовой механизм 1С анализирует итоговую строку РезультатОбработки, он обнаруживает в ней символы перевода строки Символы.ПС. Это служит для системы триггером: платформа понимает, что строка содержит сложное форматирование, и отправляет ее на запись специальным методом ЗаписатьБезОбработки().

Перед самой записью типовой код вырезает наши маркеры по краям с помощью стандартной функции СтрЗаменить, однако режим прямой записи XML уже активирован! В результате наш внедренный тег <w:br/> беспрепятственно попадает в файл document.xml без экранирования. MS Word успешно считывает разметку и отображает красивый перенос строки без каких-либо дефектов и квадратиков.

Реализация в новых версиях «1С:Документооборот»

Если вы планируете обновление конфигурации, полезно знать, что в современных версиях «1С:Документооборот» (начиная с релизов 2.1.27 и в ветке 3.0) разработчики добавили штатное решение этой проблемы. В модуле интеграции появилась вспомогательная процедура преобразования спецсимволов. Она сопоставляет символы 1С со структурами OpenXML:


Спецсимволы = Новый Соответствие;
Спецсимволы.Вставить("<w:br/>", Символы.ПС);
Спецсимволы.Вставить("</w:t><w:tab/><w:t>", Символы.Таб);

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

← На главную