Разработка и Конфигурация · 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) и Символы.ПС взаимозаменяемы, но Символы.ПС читается нагляднее, поэтому в новом коде предпочтительнее именно она.
Многострочные строковые литералы в модуле
Когда длинный текст задаётся прямо в коде, удобнее не склеивать строки через Символы.ПС, а использовать многострочный литерал: каждая новая строка начинается с символа вертикальной черты «|». Платформа сама вставляет переносы строк между фрагментами.
ТекстПисьма = "Уважаемый клиент!
|Ваш заказ сформирован.
|Сумма к оплате указана ниже.";
Такой литерал эквивалентен склейке через Символы.ПС. Вертикальная черта должна стоять в самом начале каждой продолжающей строки, иначе компилятор выдаст ошибку синтаксиса.
Сравнение вариантов
Универсальный выбор для склейки строк в коде; читаемо и кратко
Работает так же, но менее наглядно; встречается в унаследованном коде
Нужен для файлов и протоколов, ожидающих Windows-переносы строк
Удобен для длинных текстов прямо в модуле; не подходит для динамической склейки
Перенос строки в запросе
В тексте запроса переносы строк оформляются естественно — сам запрос обычно пишется как многострочный литерал с вертикальной чертой. Проблема возникает, когда нужно вставить перенос строки внутрь строкового значения в запросе, например сравнить поле с многострочной строкой.
В языке запросов нет прямого аналога Символы.ПС. Практичное решение — передать нужное значение параметром, сформировав его в коде до выполнения запроса:
Запрос.УстановитьПараметр("Разделитель", Символы.ПС);
Либо выполнить предварительную замену через СтрЗаменить() до передачи строки в запрос. Попытка вписать перенос напрямую в текст запроса приводит к ошибкам разбора или к тому, что сравнение строк не срабатывает.
Перенос строки на форме и в реквизитах
Многострочные поля ввода и надписи на управляемой форме отображают переносы, если в значении присутствует Символы.ПС. Для реквизита типа «Строка» неограниченной длины достаточно присвоить значение с переносами — пользователь увидит их, если у поля включён многострочный режим.
Для элемента «Поле надписи» переносы тоже работают, но стоит проверить свойство «Растягивать по вертикали» и высоту элемента: при фиксированной высоте часть текста будет обрезана визуально, хотя в данных она сохранится.
В табличных документах (макетах, печатных формах) перенос внутри ячейки задаётся тем же Символы.ПС, а чтобы текст отображался полностью, у ячейки должен быть разрешён перенос строк (свойство оформления «Перенос строк» в макете).
- 1Откройте макет табличного документа и найдите нужную ячейку
- 2В свойствах ячейки включите перенос строк
- 3В коде формируйте текст ячейки со вставкой Символы.ПС между фрагментами
- 4Выведите печатную форму и проверьте, что все строки видны и не обрезаны
Переносы в текстовых файлах и обмене данными
Объекты ТекстовыйДокумент и ЗаписьТекста сами добавляют разделитель строк при записи методами ЗаписатьСтроку(). По умолчанию используется системный разделитель; при необходимости его можно задать явно через параметр разделителя строк, чтобы файл соответствовал ожиданиям принимающей стороны.
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Первая строка");
Запись.ЗаписатьСтроку("Вторая строка");
Запись.Закрыть();
При чтении чужих файлов встречается обратная задача: разные источники используют LF, CRLF или даже одиночный CR. Перед разбором текста полезно нормализовать разделители через СтрЗаменить(), иначе разбиение на строки даст непредсказуемый результат.
Проверка результата и поиск проблем
Проверить, содержит ли строка переносы, можно функцией СтрЧислоСтрок(): для текста с переносами она вернёт значение больше единицы. Обратная функция СтрПолучитьСтроку(Текст, Номер) извлекает конкретную строку — удобно для отладки.
Если СтрЧислоСтрок(Текст) > 1 Тогда
Сообщить("Текст многострочный");
КонецЕсли;
Если перенос «не работает», последовательно проверьте: есть ли символ переноса в самой строке (посмотреть в отладчике), поддерживает ли место вывода многострочность (режим поля, свойства ячейки), не теряется ли перенос при промежуточных преобразованиях вроде сжатия пробелов или обработки XML.
Как проверить результат
Возвращает ожидаемое число строк
Возвращает 1 при многострочном тексте — переносы потеряны
Каждая строка видна отдельно
Текст в одну строку или обрезан — проверить режим поля и высоту
Строки разделены корректно
Всё в одну строку — заменить ПС на ВК+ПС
Частые вопросы
Чем Символы.ПС отличается от Символ(10)?
Ничем по сути: Символы.ПС — это именованная константа для символа с кодом 10. Разница только в читаемости кода, поэтому в новых разработках рекомендуется Символы.ПС.
Как сделать перенос строки в сообщении пользователю?
Склейте текст через Символы.ПС и передайте в Сообщить() или в объект СообщениеПользователю. Окно сообщений корректно отображает многострочный текст.
Почему в запросе не сравнивается многострочная строка?
Скорее всего, переносы в сравниваемых значениях записаны по-разному (ПС против ВК+ПС) или потеряны при передаче. Передайте эталонное значение параметром, сформировав его в коде, и нормализуйте разделители через СтрЗаменить().
Как убрать все переносы из строки?
Последовательно замените оба варианта: сначала СтрЗаменить(Текст, Символы.ВК + Символы.ПС, " "), затем отдельно Символы.ПС и Символы.ВК. Порядок важен, чтобы не осталось одиночных символов.
Можно ли сделать перенос строки в наименовании элемента справочника?
Технически символ переноса можно записать в строковый реквизит, но в списках и большинстве полей он будет отображаться некорректно или мешать поиску. Для многострочных данных лучше использовать отдельный реквизит с неограниченной строкой.
Что важно запомнить
Основной способ переноса строки в 1С — Символы.ПС, для Windows-файлов — пара ВК+ПС. Длинные тексты в модуле оформляются литералом с вертикальной чертой, в запросы значения с переносами передаются параметром, а на форме и в макете нужно дополнительно включить многострочный режим отображения.