К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вставить символ переноса строки в 1С

Как вставить символ переноса строки в 1С: Символы.ПС, Символ(10), многострочные литералы, перенос в макетах и печатных формах. Примеры кода и разбор ошибок.

Перенос строки в 1С встречается повсюду: в сообщениях пользователю, в текстах печатных форм, в подписях картинок, в полях комментариев и при формировании файлов. Проблема в том, что обычное нажатие Enter внутри строкового литерала не всегда даёт ожидаемый результат, а разные механизмы платформы интерпретируют перенос по-разному.

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

Ниже разобраны все рабочие способы с примерами кода, типичные ошибки и способы проверить, что перенос действительно попал в строку.

Символы.ПС — основной способ переноса строки

Наиболее правильный и читаемый способ — системное перечисление Символы со значением ПС (перевод строки). Оно возвращает символ LF (код 10), который платформа использует как стандартный разделитель строк.

ТекстСообщения = "Первая строка" + Символы.ПС + "Вторая строка";

Сообщить(ТекстСообщения);

Перечисление Символы содержит и другие полезные значения: ВК — возврат каретки (CR, код 13), Таб — табуляция, НПП — неразрывный пробел. Их можно комбинировать, когда требуется классическая Windows-последовательность CR+LF.

Преимущество Символы.ПС перед «магическими» символами в том, что код остаётся читаемым и переносимым: разработчик, который откроет ваш модуль через год, сразу поймёт намерение, а не будет гадать, какой невидимый символ спрятан в строке.

Функция Символ() и коды переноса

Альтернативный способ — встроенная функция Символ(Код), которая возвращает символ по его коду Unicode. Для переноса строки используется код 10 (LF), для возврата каретки — код 13 (CR).

Текст = "Шапка" + Символ(13) + Символ(10) + "Тело письма";

// Эквивалентно: Символы.ВК + Символы.ПС

Пара CR+LF важна при формировании текстовых файлов для сторонних систем: старые Windows-программы и некоторые банковские форматы ожидают именно такую последовательность. Одиночный LF в таких файлах может отображаться как склеенный текст без переносов.

Проверить, какие именно символы содержит строка, можно функцией КодСимвола() — она возвращает код символа на указанной позиции. Это удобно при отладке, когда перенос «вроде есть», но текст выводится одной строкой.

bsl
Текст = "Строка1" + Символы.ВК + Символы.ПС + "Строка2";
Для Позиция = 1 По СтрДлина(Текст) Цикл
    Сообщить("Позиция " + Позиция + ": код " + КодСимвола(Текст, Позиция));
КонецЦикла;

Многострочные строковые литералы

Встроенный язык позволяет записать многострочный текст прямо в литерале, не склеивая строки оператором «+». Для этого каждая строка литерала начинается с вертикальной черты |, а перенос в исходном коде становится переносом в значении строки.

ТекстПисьма = "Уважаемый клиент!

|Ваш заказ сформирован.

|Сумма к оплате: 1 500 руб.";

Такой приём удобен для длинных шаблонов: текстов писем, SQL-подобных запросов, сообщений об ошибках. Строка читается в коде так же, как будет выглядеть результат, что упрощает поддержку.

Важная деталь: перенос строки внутри литерала добавляет символ LF в значение. Если шаблон редактируется в конфигураторе, убедитесь, что лишние пробелы после вертикальной черты не попадают в текст — они станут частью строки.

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

В табличных документах и макетах печатных форм перенос работает иначе. Если текст выводится через параметр макета, символы LF внутри значения обычно отображаются корректно, но ячейка должна позволять многострочный вывод: у области макета должна быть достаточная высота, а для ячейки — не запрещён перенос текста.

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

Для форматированного документа простого символа LF недостаточно — там строки разделяются абзацами. Перенос создаётся методом Добавить() с типом элемента «ПереводСтроки» или разбиением текста на абзацы. Это отдельная модель, и прямое присваивание строки с LF даст другой результат, чем ожидается.

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

При записи текстовых файлов через ЗаписьТекста или ТекстовыйДокумент разделитель строк можно задать явно. У объекта ЗаписьТекста есть параметр конструктора «РазделительСтрок», а у ТекстовыйДокумент метод Записать() принимает тип файла и разделитель.

Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, Символы.ВК + Символы.ПС);

Запись.ЗаписатьСтроку("Первая строка");

Запись.ЗаписатьСтроку("Вторая строка");

Запись.Закрыть();

Метод ЗаписатьСтроку() сам добавляет разделитель после каждой строки — вставлять Символы.ПС в конец текста при этом не нужно, иначе получите двойные переносы и пустые строки в файле.

При выгрузке в Excel через табличный документ перенос внутри ячейки требует LF в тексте и включённого переноса в ячейке. Если файл открывается, а текст склеен — чаще всего дело в отсутствии авторазмера строки, а не в самом символе переноса.

Порядок действий для текстового файла
  1. 1
    Определите, какой разделитель ожидает принимающая система: LF или CR+LF.
  2. 2
    Создайте ЗаписьТекста с нужным разделителем строк в конструкторе.
  3. 3
    Пишите строки методом ЗаписатьСтроку() без ручного добавления Символы.ПС.
  4. 4
    Закройте запись и откройте файл в редакторе, показывающем служебные символы.
  5. 5
    Убедитесь, что переносы на месте и нет пустых строк.

Как проверить результат и разобраться с ошибками

Самая частая жалоба — «перенос вставил, а текст всё равно одной строкой». Причина почти всегда не в символе, а в месте отображения: поле ввода в режиме одной строки, ячейка макета без переноса, элемент формы с отключённым многострочным режимом.

Для диагностики выведите строку через СтрЧислоСтрок() — функция считает строки, разделённые символом переноса. Если функция возвращает 2 и больше, а на экране одна строка, проблема в визуальном элементе, а не в данных.

Если СтрЧислоСтрок(Текст) > 1 Тогда

// Переносы в строке есть — ищем проблему в отображении

КонецЕсли;

Обратная задача — убрать лишние переносы из текста, полученного извне. Используйте СтрЗаменить(Текст, Символы.ПС, " ") для замены переносов пробелами или СокрЛП() для обрезки переносов по краям строки.

Типичные ошибки
01
Вставка Символы.ПС в текст, который выводится методом ЗаписатьСтроку(), — получаются двойные пустые строки в файле.
02
Использование только LF там, где принимающая система ждёт CR+LF, — текст слипается в одну строку.
03
Ожидание переноса в однострочном поле ввода — символ есть в данных, но не отображается; нужно включить многострочный режим поля.
04
Пробелы после вертикальной черты в многострочном литерале — они попадают в текст и ломают форматирование.
Контрольные точки

Как проверить результат

Число строк в переменной
Норма

СтрЧислоСтрок() возвращает ожидаемое количество строк

Тревожный признак

Возвращает 1 — перенос не попал в строку, проверьте конкатенацию

Отображение в поле формы
Норма

Текст показан в несколько строк

Тревожный признак

Одна строка — включите многострочный режим или РастягиватьПоВертикали

Файл после выгрузки
Норма

Переносы видны в редакторе с отображением служебных символов

Тревожный признак

Пустые строки или склейка — неверный разделитель строк

Часто задаваемые вопросы

Чем Символы.ПС отличается от Символы.ВК?

Символы.ПС — это символ LF (код 10), перевод строки. Символы.ВК — возврат каретки CR (код 13). Внутри платформы 1С стандартным разделителем считается LF, а пара CR+LF нужна в основном для файлов, которые читают внешние Windows-программы.

Как вставить перенос строки в сообщение пользователю?

Склейте части текста через Символы.ПС и передайте результат в Сообщить() или в объект СообщениеПользователю. Например: Сообщить("Ошибка в строке 5" + Символы.ПС + "Проверьте заполнение суммы"). Окно сообщений корректно отображает такие переносы.

Почему перенос не работает в поле ввода на форме?

У элемента формы «Поле ввода» должен быть включён многострочный режим (свойство МногострочныйРежим), иначе символы переноса хранятся в данных, но не отображаются. Дополнительно проверьте свойство РастягиватьПоВертикали, чтобы поле показывало несколько строк по высоте.

Как убрать все переносы строк из текста?

Используйте СтрЗаменить: Текст = СтрЗаменить(Текст, Символы.ПС, " "). Если в тексте встречается и CR, замените и его: СтрЗаменить(Текст, Символы.ВК, ""). Для удаления переносов только по краям строки достаточно СокрЛП().

Работает ли перенос строки в запросах 1С?

Перенос внутри текстового литерала в запросе задаётся так же — через вертикальную черту в многострочном литерале или через конкатенацию с Символы.ПС в параметре. Сам по себе запрос не требует специальных символов: переносы в тексте запроса нужны только для читаемости кода.

Что использовать для переноса в форматированном документе?

В форматированном документе строки разделяются абзацами, а не символом LF. Используйте метод Добавить() с типом элемента «ПереводСтроки» внутри абзаца либо создавайте новый абзац для каждой строки текста. Прямая вставка строки с Символы.ПС не даст ожидаемого визуального результата.

Итог

Что важно запомнить

Стандартный способ переноса строки в 1С — Символы.ПС; для файлов под Windows добавляйте Символы.ВК. В многострочных литералах используйте вертикальную черту, а при записи файлов не дублируйте переносы — ЗаписатьСтроку() добавляет разделитель сама. Если перенос есть в данных, но не виден, проверяйте настройки отображения: многострочный режим поля или перенос текста в ячейке макета.