При программном формировании документов Microsoft Word из 1С через COM-соединение часто возникает необходимость передать в текст специальные знаки разметки: неразрывные пробелы, принудительные переводы строк, разрывы страниц или маркеры абзацев. Разберем, как устроена система кодов в MS Word, какие коды соответствуют непечатным символам и как правильно внедрять их в текст с помощью функции Символ().
Для программной вставки управляющих и типографских символов в платформе 1С:Предприятие используется встроенная функция Символ(), принимающая числовой код символа в кодировке Unicode/ASCII, а для обратного преобразования — функция КодСимвола().
Посмотрим на базовый синтаксис функции в 1С:
// Получение символа по его коду Unicode
СимволНеразрывногоПробела = Символ(160);
БукваЯ = Символ(1103);
При передаче строки в свойство Range.Text или Selection.Text объекта Microsoft Word текстовый процессор интерпретирует определенные коды как структурные команды и служебные знаки.
Рассмотрим основные коды символов, применяемые при формировании печатных форм и отчетов:
Range.Paragraphs.Count.Проанализируем пример вставки форматированного фрагмента текста с использованием неразрывных пробелов и переводов строк:
// Подключение к 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. Он сигнализирует о том, что для абзаца включены особые правила верстки в свойствах абзаца:
KeepWithNext = True) — часто используется для заголовков, чтобы они не оставались внизу страницы без текста.KeepTogether = True) — запрещает перенос строк одного абзаца на следующую страницу.PageBreakBefore = True) — принудительно переносит абзац на начало нового листа.WidowControl = True).Для программного управления этими свойствами следует обращаться напрямую к объекту ParagraphFormat:
// Запрет отрыва заголовка от последующего текста
Диапазон.ParagraphFormat.KeepWithNext = Истина;
Если в документе встретился неизвестный спецсимвол, выяснить его точный код для использования в 1С можно следующим образом: скопируйте символ в буфер обмена, вставьте в строковую переменную 1С и передайте в функцию КодСимвола().
НеизвестныйСимвол = " "; // Вставленный символ
Код = КодСимвола(НеизвестныйСимвол, 1);
Сообщить("Код символа: " + Формат(Код, "ЧГ=0"));