Разработка и Конфигурация · 10 мин
Как переносить строку в 1С
Разбираем перенос строки в 1С: Символы.ПС и Символы.ВК, перенос в запросах, многострочных полях и макетах, типичные ошибки и проверка результата.
Перенос строки в 1С — задача, которая встречается в самых разных ситуациях: при формировании многострочного сообщения пользователю, при выводе адреса в печатной форме, при склейке текста в запросе или при заполнении многострочного поля ввода. В зависимости от контекста используются разные механизмы: системное перечисление Символы, функция СтрСоединить, символ вертикальной черты в литералах или специальные приёмы в языке запросов.
Главная сложность в том, что «перенос строки» не одинаков везде. В коде модуля, в запросе, в макете табличного документа и в поле ввода формы работают разные правила, и символ, который корректно отображается в сообщении, может оказаться лишним при передаче данных через файл или веб-сервис. Поэтому важно понимать, какой именно символ вы вставляете и где он будет интерпретироваться.
Ниже разобраны основные способы переноса строки во встроенном языке 1С, в запросах, в макетах и при обмене данными, а также типичные ошибки и способы проверить результат до того, как текст уйдёт пользователю или во внешнюю систему.
Перенос строки в коде через Символы.ПС
Основной способ вставить перевод строки во встроенном языке — системный набор Символы. Это не перечисление в привычном смысле, а встроенный объект, содержащий часто используемые непечатаемые символы: Символы.ПС (перевод строки, LF), Символы.ВК (возврат каретки, CR), Символы.Таб (табуляция), Символы.НПП (неразрывный пробел) и другие.
Типичный пример — формирование сообщения из нескольких строк:
ТекстСообщения = "Проверка завершена." + Символы.ПС
+ "Найдено ошибок: " + КоличествоОшибок + Символы.ПС
+ "Подробности в журнале регистрации.";
Сообщить(ТекстСообщения);
Если строк много, удобнее собрать их в массив и соединить функцией СтрСоединить с разделителем Символы.ПС — так код короче и читается легче, чем цепочка конкатенаций:
Строки = Новый Массив;
Строки.Добавить("Шапка документа");
Строки.Добавить("Состав изменён");
Строки.Добавить("Итог: " + Итог);
Текст = СтрСоединить(Строки, Символы.ПС);
Многострочные строковые литералы и символ «|»
Когда текст известен заранее и состоит из нескольких строк, не обязательно склеивать его кодом. Встроенный язык позволяет записывать многострочный литерал: строка продолжается на следующей строке модуля, если новая строка начинается с символа вертикальной черты |. Каждая такая строка при компиляции соединяется с предыдущей через перевод строки.
ТекстПисьма = "Уважаемый клиент!
|Ваш заказ собран и передан в доставку.
|Номер накладной: " + НомерНакладной;
Обратите внимание: пробелы перед символом | (отступ кода) в результат не попадают, а вот пробелы после | — попадают в строку целиком. Это частая причина «лесенки» в тексте, когда строки визуально сдвинуты. Если нужен аккуратный текст без лишних пробелов, начинайте содержимое сразу после вертикальной черты.
Ограничение приёма: литерал с «|» удобен для статичных шаблонов, но не подходит, когда число строк заранее неизвестно. В таком случае возвращайтесь к массиву и СтрСоединить.
Перенос строки в запросах
В языке запросов 1С нет прямого аналога Символы.ПС, поэтому склеить многострочный текст прямо в тексте запроса нельзя. Рабочий приём — передать символ переноса параметром и соединить строки оператором конкатенации +:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование + &ПС + Контрагенты.Адрес КАК Представление
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
Запрос.УстановитьПараметр("ПС", Символы.ПС);
Альтернатива — собрать текст уже после запроса, при обходе выборки. Этот вариант предпочтительнее, если строк много или форматирование сложное: в коде доступны СтрШаблон, условия и циклы, а запрос остаётся простым и быстрым. Сборку текста в запросе оправданно держать только тогда, когда результат сразу уходит в поле компоновки данных или макет без дополнительной обработки.
Как выбрать действие
Перенос строки в макетах и печатных формах
В табличном документе (макете печатной формы) перенос строки внутри ячейки работает, если сама строка табличного документа имеет достаточную высоту либо включён автоподбор высоты. Текст с Символы.ПС, переданный в параметр области, отобразится в несколько строк, но при фиксированной высоте строки часть текста может быть обрезана визуально — данные при этом не теряются, страдает только отображение.
Для надёжного вывода многострочного текста в печатной форме проверьте два момента: в свойствах ячейки макета должен быть разрешён перенос (обычно он включён по умолчанию для текстовых ячеек), а высота строки — либо авто, либо рассчитана с запасом. Если текст формируется из нескольких реквизитов (например, адрес из города, улицы и дома), склейку удобно делать через СтрШаблон или массив с последующим соединением через Символы.ПС.
Отдельный случай — вывод в текстовый макет или в файл. Здесь платформа при записи может преобразовывать концы строк в зависимости от настроек объекта ЗаписьТекста. Если файл предназначен для системы, которая строго требует Windows-переносы, явно используйте Символы.ВК + Символы.ПС при формировании содержимого.
Многострочные поля ввода и отображение пользователю
Чтобы пользователь мог вводить и видеть несколько строк в поле формы, у поля ввода должно быть включено свойство «Многострочный режим». Без него переводы строк в значении либо не отображаются, либо ввод Enter завершает редактирование, а не добавляет новую строку. В многострочном поле Enter по умолчанию вставляет перенос, а переход по Ctrl+Enter может завершать редактирование — поведение зависит от настроек поля.
При выводе текста через Сообщить или в элемент «Надпись» переносы Символы.ПС отображаются корректно. А вот при выводе в однострочные элементы (заголовок, колонка таблицы) перевод строки может быть заменён пробелом или вовсе отброшен — это нормальное поведение платформы, а не ошибка в вашем коде. Если в таблице нужно показать многострочный текст, включите для соответствующей колонки свойство отображения в несколько строк и настройте высоту строк.
Как проверить результат
Каждая логическая строка начинается с новой строки
Текст слипся в одну строку или видны лишние пробелы в начале строк
Enter добавляет строку, текст сохраняется с переносами
Enter завершает редактирование, переносы пропадают после записи
Весь текст виден, строки не обрезаны
Нижние строки скрыты из-за фиксированной высоты строки макета
Файл открывается в приёмнике с корректными переносами
Всё содержимое — одна строка или появились лишние пустые строки
Частые ошибки и ограничения
Самая распространённая ошибка — ожидать, что один и тот же символ переноса сработает везде одинаково. На практике контекст решает всё: Символы.ПС отлично работает внутри платформы, но при обмене файлами иногда требуется пара ВК + ПС, а в некоторых форматах (например, при выгрузке в XML или JSON) переводы строк внутри значений могут требовать экранирования, которое платформа выполняет автоматически при сериализации.
Вторая группа ошибок связана с производительностью и читаемостью: склейка большого текста оператором + в цикле создаёт множество промежуточных строк. Для объёмных текстов используйте объект ЗаписьТекста в памяти или массив с последующим СтрСоединить — это и быстрее, и понятнее при сопровождении.
Наконец, помните про функцию СтрЗаменить как инструмент нормализации: если текст пришёл извне с непредсказуемыми переносами, имеет смысл привести все варианты к одному виду перед обработкой, заменив Символы.ВК + Символы.ПС на Символы.ПС, а затем удалив одиночные Символы.ВК.
Что важно запомнить
В коде используйте Символы.ПС и СтрСоединить, в статичных текстах — литерал с «|», в запросах — параметр с символом переноса, в макетах следите за высотой строк, а при обмене с внешними системами заранее уточняйте требуемый формат конца строки.
Частые вопросы
Чем отличаются Символы.ПС и Символы.ВК?
Символы.ПС — это перевод строки (LF, код 10), Символы.ВК — возврат каретки (CR, код 13). Внутри 1С для переноса обычно достаточно ПС. Пара ВК+ПС — это Windows-стандарт конца строки, который может требоваться при записи файлов для сторонних программ. Использовать один ВК без ПС для переноса не следует.
Как перенести строку в заголовке или однострочном поле?
Никак — однострочные элементы формы не отображают переводы строк: они заменяются пробелами или игнорируются. Если нужен многострочный вывод, используйте многострочное поле ввода, элемент «Надпись» с достаточной высотой или сообщение пользователю.
Можно ли вставить перенос строки прямо в тексте запроса?
Готовой константы переноса в языке запросов нет. Стандартный приём — передать Символы.ПС через параметр запроса и соединить строки оператором «+». Либо формируйте многострочный текст уже после запроса, при обходе выборки в коде.
Почему в печатной форме многострочный текст обрезан?
Чаще всего причина в фиксированной высоте строки макета: данные в ячейке есть целиком, но видна только часть. Установите для строки автоподбор высоты или увеличьте высоту вручную и проверьте, что в свойствах ячейки разрешён перенос текста.
Как убрать лишние переносы строк из текста, полученного извне?
Нормализуйте текст через СтрЗаменить: сначала замените пару Символы.ВК + Символы.ПС на Символы.ПС, затем одиночные Символы.ВК на Символы.ПС. После этого при необходимости замените Символы.ПС на пробел или нужный разделитель.
Что лучше для склейки множества строк: «+» или СтрСоединить?
Для двух-трёх строк разницы нет, но при большом количестве лучше собрать строки в массив и применить СтрСоединить с разделителем Символы.ПС. Код получается короче, легче правится и не создаёт лишних промежуточных строк в цикле.