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