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