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

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

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

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

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

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

Перенос строки через Символы.ПС

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

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

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

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

СтрокаДляФайла = "Строка1" + Символы.ВК + Символы.ПС + "Строка2";

Признак правильного выбора: текст корректно отображается там, где будет использоваться. Если файл открывается в Блокноте Windows одной длинной строкой — вероятно, использован только ПС без ВК.

Перенос через функцию Символ()

Функция Символ(Код) возвращает символ по его числовому коду Unicode. Для переноса строки используют код 10 (аналог ПС) или связку Символ(13) + Символ(10) для CRLF.

Текст = "А" + Символ(10) + "Б";

ТекстCRLF = "А" + Символ(13) + Символ(10) + "Б";

Такой вариант встречается в старом коде и в типовых конфигурациях. По сути Символ(10) и Символы.ПС взаимозаменяемы, но Символы.ПС читается нагляднее, поэтому в новом коде предпочтительнее именно она.

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

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

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

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

|Сумма к оплате указана ниже.";

Такой литерал эквивалентен склейке через Символы.ПС. Вертикальная черта должна стоять в самом начале каждой продолжающей строки, иначе компилятор выдаст ошибку синтаксиса.

Сравнение вариантов

Символы.ПС

Универсальный выбор для склейки строк в коде; читаемо и кратко

Символ(10)

Работает так же, но менее наглядно; встречается в унаследованном коде

ВК + ПС (CRLF)

Нужен для файлов и протоколов, ожидающих Windows-переносы строк

Литерал с |

Удобен для длинных текстов прямо в модуле; не подходит для динамической склейки

Перенос строки в запросе

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

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

Запрос.УстановитьПараметр("Разделитель", Символы.ПС);

Либо выполнить предварительную замену через СтрЗаменить() до передачи строки в запрос. Попытка вписать перенос напрямую в текст запроса приводит к ошибкам разбора или к тому, что сравнение строк не срабатывает.

Перенос строки на форме и в реквизитах

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

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

В табличных документах (макетах, печатных формах) перенос внутри ячейки задаётся тем же Символы.ПС, а чтобы текст отображался полностью, у ячейки должен быть разрешён перенос строк (свойство оформления «Перенос строк» в макете).

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

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

Объекты ТекстовыйДокумент и ЗаписьТекста сами добавляют разделитель строк при записи методами ЗаписатьСтроку(). По умолчанию используется системный разделитель; при необходимости его можно задать явно через параметр разделителя строк, чтобы файл соответствовал ожиданиям принимающей стороны.

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

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

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

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

При чтении чужих файлов встречается обратная задача: разные источники используют LF, CRLF или даже одиночный CR. Перед разбором текста полезно нормализовать разделители через СтрЗаменить(), иначе разбиение на строки даст непредсказуемый результат.

Типичные ошибки
01
Использование только Символы.ПС для файла, который открывают в Блокноте Windows — весь текст сливается в одну строку
02
Попытка вставить перенос в запрос напрямую — ошибка разбора или несовпадение строк при сравнении
03
Отсутствие вертикальной черты в начале строки многострочного литерала — синтаксическая ошибка модуля
04
Переносы в тексте есть, но у ячейки макета не включён перенос строк — на печати видна только первая строка

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

Проверить, содержит ли строка переносы, можно функцией СтрЧислоСтрок(): для текста с переносами она вернёт значение больше единицы. Обратная функция СтрПолучитьСтроку(Текст, Номер) извлекает конкретную строку — удобно для отладки.

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

Сообщить("Текст многострочный");

КонецЕсли;

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

Контрольные точки

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

СтрЧислоСтрок(Текст)
Норма

Возвращает ожидаемое число строк

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

Возвращает 1 при многострочном тексте — переносы потеряны

Отображение на форме
Норма

Каждая строка видна отдельно

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

Текст в одну строку или обрезан — проверить режим поля и высоту

Файл в стороннем редакторе
Норма

Строки разделены корректно

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

Всё в одну строку — заменить ПС на ВК+ПС

Частые вопросы

Чем Символы.ПС отличается от Символ(10)?

Ничем по сути: Символы.ПС — это именованная константа для символа с кодом 10. Разница только в читаемости кода, поэтому в новых разработках рекомендуется Символы.ПС.

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

Склейте текст через Символы.ПС и передайте в Сообщить() или в объект СообщениеПользователю. Окно сообщений корректно отображает многострочный текст.

Почему в запросе не сравнивается многострочная строка?

Скорее всего, переносы в сравниваемых значениях записаны по-разному (ПС против ВК+ПС) или потеряны при передаче. Передайте эталонное значение параметром, сформировав его в коде, и нормализуйте разделители через СтрЗаменить().

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

Последовательно замените оба варианта: сначала СтрЗаменить(Текст, Символы.ВК + Символы.ПС, " "), затем отдельно Символы.ПС и Символы.ВК. Порядок важен, чтобы не осталось одиночных символов.

Можно ли сделать перенос строки в наименовании элемента справочника?

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

Итог

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

Основной способ переноса строки в 1С — Символы.ПС, для Windows-файлов — пара ВК+ПС. Длинные тексты в модуле оформляются литералом с вертикальной чертой, в запросы значения с переносами передаются параметром, а на форме и в макете нужно дополнительно включить многострочный режим отображения.