Как использовать коды символов форматирования и непечатных знаков MS Word в 1С?

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

При программном формировании документов Microsoft Word из 1С через COM-соединение часто возникает необходимость передать в текст специальные знаки разметки: неразрывные пробелы, принудительные переводы строк, разрывы страниц или маркеры абзацев. Разберем, как устроена система кодов в MS Word, какие коды соответствуют непечатным символам и как правильно внедрять их в текст с помощью функции Символ().

Принцип работы со спецсимволами в 1С

Для программной вставки управляющих и типографских символов в платформе 1С:Предприятие используется встроенная функция Символ(), принимающая числовой код символа в кодировке Unicode/ASCII, а для обратного преобразования — функция КодСимвола().

Посмотрим на базовый синтаксис функции в 1С:


// Получение символа по его коду Unicode
СимволНеразрывногоПробела = Символ(160);
БукваЯ = Символ(1103);

При передаче строки в свойство Range.Text или Selection.Text объекта Microsoft Word текстовый процессор интерпретирует определенные коды как структурные команды и служебные знаки.

Сводная таблица кодов форматирования MS Word

Рассмотрим основные коды символов, применяемые при формировании печатных форм и отчетов:

  1. Символ(13) — конец параграфа (абзаца), эквивалент нажатия клавиши Enter. Наличие этого символа увеличивает счетчик абзацев в коллекции Range.Paragraphs.Count.
  2. Символ(11) — принудительный разрыв строки внутри текущего абзаца (комбинация Shift+Enter).
  3. Символ(12) — разрыв страницы (Ctrl+Enter) или разрыв раздела.
  4. Символ(14) — разрыв колонки в многоколоночном тексте (Ctrl+Shift+Enter).
  5. Символ(9) — знак горизонтальной табуляции (клавиша Tab).
  6. Символ(160) — неразрывный пробел (Ctrl+Shift+Пробел), предотвращающий перенос связанных слов на новую строку (например, инициалов или сумм с валютой).
  7. Символ(30) или Символ(8209) — неразрывный дефис (Ctrl+Shift+Дефис).
  8. Символ(31) или Символ(173) — мягкий (условный) перенос, отображаемый только при переносе слова на границе строки (Ctrl+Дефис).
  9. Символ(7) — специальный служебный маркер границы ячейки или конца строки таблицы (в паре с кодом 13).

Примеры программного формирования текста и таблиц

Проанализируем пример вставки форматированного фрагмента текста с использованием неразрывных пробелов и переводов строк:


// Подключение к Microsoft Word
Ворд = Новый COMОбъект("Word.Application");
Ворд.Visible = Ложь;
Документ = Ворд.Documents.Add();

// Получение диапазона документа
Диапазон = Документ.Range(0, 0);

// Формирование строки со специальными знаками
НеразрывныйПробел = Символ(160);
КонецАбзаца = Символ(13);
РазрывСтроки = Символ(11);

ТекстДокумента = "Договор" + НеразрывныйПробел + "№" + НеразрывныйПробел + "123/45" + РазрывСтроки + 
                 "г." + НеразрывныйПробел + "Москва" + КонецАбзаца + 
                 "Начало следующего абзаца...";

Диапазон.Text = ТекстДокумента;

Особенности работы с ячейками таблиц и маркером конца ячейки

Выясним важную техническую деталь: при чтении текста из ячейки таблицы Word в конце строки всегда присутствуют два служебных символа с кодами 13 и 7 (Символ(13) + Символ(7)). Символ с кодом 7 обозначает границу ячейки и хранит в себе метаданные ее форматирования.

Важно: При прямой перезаписи свойства Cell.Range.Text нельзя передавать символ 7 вручную, так как это может повредить структуру таблицы. При извлечении чистого текста из ячейки Word эти два символа необходимо удалять.

Посмотрим на пример корректного чтения и очистки текста ячейки:


// Получение текста ячейки таблицы
ТекстЯчейки = ТаблицаWord.Cell(1, 1).Range.Text;

// Отсекаем последние 2 служебных символа (Символ(13) + Символ(7))
Если СтрДлина(ТекстЯчейки) >= 2 Тогда
    ЧистыйТекст = Лев(ТекстЯчейки, СтрДлина(ТекстЯчейки) - 2);
Иначе
    ЧистыйТекст = ТекстЯчейки;
КонецЕсли;

Графические маркеры форматирования на полях

Разберем природу черных точек (квадратов), которые отображаются в левом поле напротив абзацев при включении режима непечатных знаков. Данный индикатор не является символом и не имеет кода в Unicode. Он сигнализирует о том, что для абзаца включены особые правила верстки в свойствах абзаца:

  1. Не отрывать от следующего (KeepWithNext = True) — часто используется для заголовков, чтобы они не оставались внизу страницы без текста.
  2. Не разрывать абзац (KeepTogether = True) — запрещает перенос строк одного абзаца на следующую страницу.
  3. С новой страницы (PageBreakBefore = True) — принудительно переносит абзац на начало нового листа.
  4. Запрет висячих строк (WidowControl = True).

Для программного управления этими свойствами следует обращаться напрямую к объекту ParagraphFormat:


// Запрет отрыва заголовка от последующего текста
Диапазон.ParagraphFormat.KeepWithNext = Истина;

Как узнать код любого символа из документа Word

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


НеизвестныйСимвол = " "; // Вставленный символ
Код = КодСимвола(НеизвестныйСимвол, 1);
Сообщить("Код символа: " + Формат(Код, "ЧГ=0"));
← На главную