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

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

Как сделать многострочную строку в 1С

Как создать многострочную строку в 1С: вертикальная черта, Символы.ПС, СтрСоединить и текстовые шаблоны. Примеры кода, ошибки и советы разработчику.

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

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

Способ 1: вертикальная черта в строковом литерале

Основной механизм встроенного языка: строковый литерал можно разорвать на несколько строк исходного кода, если каждая следующая строка начинается с символа | (вертикальная черта). Платформа склеит фрагменты в одну строку, вставив между ними перевод строки.

ТекстСообщения = "Первая строка сообщения

|Вторая строка сообщения

|Третья строка сообщения";

В переменной ТекстСообщения окажется текст из трёх строк, разделённых символами перевода строки. Отступ перед вертикальной чертой в коде значения не имеет — он нужен только для читаемости. А вот пробелы после черты попадут в строку, поэтому следите за ними при форматировании.

Важное ограничение: внутри многострочного литерала нельзя размещать комментарии — всё, что написано после черты, станет частью строки. Также нельзя прервать литерал пустой строкой без символа |: компилятор выдаст ошибку «Ожидается символ '|'».

Способ 2: конкатенация через Символы.ПС

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

ТекстПисьма = "Уважаемый(ая), " + ИмяКлиента + "!" + Символы.ПС

+ Символы.ПС

+ "Ваш заказ № " + НомерЗаказа + " отгружен." + Символы.ПС

+ "Сумма к оплате: " + Формат(СуммаЗаказа, "ЧДЦ=2") + " руб.";

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

Помимо Символы.ПС доступны Символы.ВК (возврат каретки) и Символы.Таб. Для файлов обмена иногда требуется комбинация Символы.ВК + Символы.ПС — классический перевод строки Windows. Проверяйте требования приёмника: некоторые внешние системы чувствительны к типу перевода строк.

Способ 3: СтрСоединить для массивов строк

Если строки уже лежат в массиве или формируются в цикле, используйте функцию СтрСоединить с разделителем Символы.ПС. Это чище и быстрее, чем наращивание строки оператором + в цикле.

Строки = Новый Массив;

Строки.Добавить("Шапка отчёта");

Строки.Добавить(""); // пустая строка-разделитель

Для Каждого СтрокаТовара Из Товары Цикл

Строки.Добавить(СтрокаТовара.Номенклатура + " — " + СтрокаТовара.Количество);

КонецЦикла;

ИтоговыйТекст = СтрСоединить(Строки, Символы.ПС);

Функция доступна во всех современных версиях платформы 8.3. Обратный приём — разбор многострочной строки — выполняется через СтрРазделить или через СтрЧислоСтрок и СтрПолучитьСтроку, если нужен построчный обход по номеру.

Способ 4: макеты и шаблоны для длинных текстов

Когда текст большой — запрос на десятки строк, HTML-письмо, печатная форма, — хранить его прямо в коде неудобно. Правильное место для такого текста — макет конфигурации или общий текстовый макет.

Как вынести текст в макет
  1. 1
    В конфигураторе откройте ветку «Общие — Макеты» и добавьте новый макет типа «Текстовый документ».
  2. 2
    Вставьте в макет нужный многострочный текст; параметры пометьте квадратными скобками, например [ИмяКлиента].
  3. 3
    В коде получите текст: ПолучитьОбщийМакет("ШаблонПисьма").ПолучитьТекст().
  4. 4
    Подставьте параметры через СтрЗаменить или используйте объект ШаблонСтроки для подстановки значений.

Для текстов запросов вообще не стоит использовать конкатенацию: конструктор запроса и многострочный литерал с вертикальной чертой — стандарт. Текст запроса в коде выглядит так:

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Номенклатура КАК Номенклатура,

| Товары.Количество КАК Количество

|ИЗ

| Документ.Реализация.Товары КАК Товары

|ГДЕ

| Товары.Ссылка = &Ссылка";

Обратите внимание: в тексте запроса вертикальная черта ставится в начале каждой строки, а амперсанд в параметре &Ссылка внутри литерала не требует экранирования.

Сравнение способов

Вертикальная черта |

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

Конкатенация с Символы.ПС

Гибкий вариант для сборки текста из переменных. Становится громоздким при большом числе фрагментов.

СтрСоединить

Оптимален для циклов и массивов строк. Требует, чтобы все части были собраны заранее.

Макет

Правильное место для длинных шаблонов и текстов, которые меняются без изменения кода. Избыточен для двух-трёх строк.

Многострочный ввод в интерфейсе: поле и реквизит

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

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

Если многострочное поле на управляемой форме не растягивается и Enter закрывает редактирование, проверьте два свойства: «МногострочныйРежим» у поля и длину строки у реквизита — при фиксированной длине 1 многострочный ввод бессмыслен.

Типичные ошибки
01
Забытая вертикальная черта в начале продолжения строки — модуль не компилируется с ошибкой синтаксиса.
02
Одиночные двойные кавычки внутри литерала вместо удвоенных — строка обрывается, и весь последующий код «съезжает».
03
Наращивание строки оператором + в большом цикле вместо СтрСоединить — лишние затраты памяти и времени на копирование строк.
04
Хранение длинного HTML или текста письма прямо в коде — любую правку формулировки приходится делать через разработчика и обновление конфигурации.
05
Ожидание, что Символы.ПС корректно отобразится во всех внешних программах — для файлов часто нужна пара ВК+ПС.

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

Быстрее всего проверить содержимое многострочной строки через Сообщить() в отладчике или через «Вычислить выражение» (Shift+F9) на точке останова. Служебные функции помогут убедиться, что структура текста именно такая, как ожидалось.

  • СтрЧислоСтрок(Текст) — вернёт количество строк; если ожидали 3, а получили 1, переводы строк потерялись.
  • СтрПолучитьСтроку(Текст, 2) — позволит посмотреть конкретную строку.
  • СтрДлина(Текст) — общая длина с учётом невидимых символов перевода строк.

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

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

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

Количество строк через СтрЧислоСтрок
Норма

Совпадает с ожидаемым числом строк

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

Вернулось 1 — переводы строк потеряны или не добавлены

Компиляция модуля
Норма

Модуль сохраняется без ошибок синтаксиса

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

Ошибка «Ожидается символ |» или обрыв строки из-за кавычек

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

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

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

Весь текст в одну строку — проверьте МногострочныйРежим и РазмещениеТекста

Итог

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

Для литералов используйте вертикальную черту, для сборки из переменных — Символы.ПС или СтрСоединить, длинные шаблоны выносите в макеты. Кавычки внутри строк удваивайте, а результат проверяйте через СтрЧислоСтрок и отладчик.

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

Можно ли вставить комментарий внутрь многострочного литерала?

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

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

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

Почему текст запроса с вертикальной чертой выдаёт ошибку?

Чаще всего причина не в черте, а в незакрытых кавычках внутри текста или в пропущенной черте на одной из строк. Проверьте, что каждая строка продолжения начинается с |, а кавычки внутри текста удвоены. Ошибки самого запроса (неверные поля, таблицы) выявляются уже при выполнении, а не при компиляции.

Как вставить значение переменной внутрь многострочного литерала?

Напрямую внутри литерала переменные не подставляются. Разорвите строку конкатенацией: "Начало " + Переменная + Символы.ПС + "|Продолжение". Альтернатива — использовать шаблон с метками [Параметр] и заменять их через СтрЗаменить.

Есть ли ограничение на длину многострочной строки?

Практических ограничений на длину строковой переменной в 1С нет — строки неограниченной длины могут содержать очень большие тексты. Однако хранение мегабайтных текстов в реквизитах базы данных замедляет выборки; для таких данных лучше подходят хранилища значений или файлы.

Как вывести многострочный текст в сообщении пользователю?

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