Работа с COM-объектами Microsoft Word — это стандартная задача для разработчика 1С, когда требуется сформировать печатную форму со сложным форматированием. Однако часто возникает ситуация, когда при программном заполнении элементов управления (ContentControls) стандартные символы переноса строки, такие как Символы.ПС или Символ(13), просто игнорируются программой. В итоге текст слипается в одну строку, что портит внешний вид документа.
В этой статье мы подробно разберем, почему это происходит, и проанализируем несколько способов решения проблемы: от настройки самого шаблона до программных манипуляций с объектами Word.
Когда мы используем современные шаблоны Word, мы чаще всего работаем с ContentControls (элементами управления содержимым). По умолчанию многие из них настроены на работу с «Обычным текстом» без поддержки многострочности. Даже если вы передадите в такой элемент строку, содержащую символы возврата каретки, Word отфильтрует их, так как конфигурация элемента запрещает разрывы строк.
Рассмотрим стандартный код, который часто приводит к ошибке (отсутствию переносов):
WordApplication = Новый COMОбъект("Word.Application");
WordDocument = WordApplication.Documents.Open(ФайлВордовскогоДокумента);
Документ = WordApplication.ActiveDocument();
Для каждого ЭлементУправления Из Документ.ContentControls Цикл
// Текст с переносами строк
МойТекст = "Иванов" + Символы.ПС + "Иван" + Символы.ПС + "Иванович";
// Попытка записи
ЭлементУправления.Range.Text = МойТекст;
КонецЦикла;
В данном случае текст в документе отобразится как «ИвановИванИванович» или с пробелами вместо переносов.
Как выяснилось в ходе обсуждения, самым простым и эффективным способом является изменение настроек самого шаблона .dotx или документа .docx. Если вы используете элементы типа «Обычный текст», выполните следующие шаги:
После этой настройки Word начнет корректно интерпретировать символы Символ(13) и Символы.ПС, передаваемые из 1С.
Проанализируем ситуацию, когда настройка шаблона выполнена, но переносы все равно работают некорректно. Важно понимать, какой именно символ ожидает Word через COM-соединение. В системе 1С Символы.ПС часто представляет собой связку символов CR + LF (коды 13 и 10).
Попробуем использовать разные варианты кодов в зависимости от контекста:
Пример кода с использованием мягкого переноса:
МойТекст = "Строка 1" + Символ(11) + "Строка 2";
ЭлементУправления.Range.Text = МойТекст;
Если у вас нет возможности править шаблон вручную (например, он формируется динамически), мы можем попробовать изменить свойства элемента управления прямо из кода 1С. Для элементов типа «Обычный текст» за многострочность отвечает свойство MultiLine.
Для каждого ЭлементУправления Из Документ.ContentControls Цикл
// Проверяем тип элемента (если нужно) и разрешаем многострочность
Попытка
ЭлементУправления.MultiLine = Истина;
Исключение
// Элемент может не поддерживать это свойство
КонецПопытки;
МойТекст = "Иванов" + Символ(13) + "Иван";
ЭлементУправления.Range.Text = МойТекст;
КонецЦикла;
Иногда прямое присваивание значения свойству Text работает некорректно, так как Word пытается интерпретировать всю строку целиком. Более надежный способ — использование методов объекта Range. Разберем по шагам, как добавить текст с принудительным абзацем:
Область = ЭлементУправления.Range;
Область.Text = ""; // Очищаем старое значение
Область.InsertAfter("Первая строка");
Область.InsertParagraphAfter(); // Вставляет символ абзаца
Область.InsertAfter("Вторая строка");
Этот метод гарантирует, что Word создаст полноценный объект абзаца в структуре документа.
Часто в обсуждениях упоминаются сочетания типа ^p (абзац) или ^l (разрыв строки). Важно помнить: эти символы работают только внутри встроенной функции Word Find and Replace (Поиск и замена). Если вы просто напишете в коде 1С МойТекст = "Линия 1^pЛиния 2", Word так и выведет это в документе — как обычный текст с галочкой и буквой «p».
Символы ^p следует использовать только при вызове метода Execute объекта Find:
Замена = Документ.Content.Find;
// Заменяем маркер {Параметр} на многострочный текст с кодом символа
Замена.Execute("{Текст_Письма}", , , , , , , , , "Строка1" + Символ(13) + "Строка2", 2);
Подводя итог нашему анализу, выделим основные правила работы с переносами строк в Word из 1С:
Rich Text Content Control переносы работают лучше, чем для Plain Text.Символ(13), для простого переноса внутри абзаца — Символ(11).Применяя эти методы, вы сможете формировать профессионально оформленные документы с любым количеством строк внутри параметров шаблона.