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

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

Как убрать символы переноса строки в 1С

Практические способы убрать переносы строк в 1С: СтрЗаменить, Символы.ПС, ВК, Символ(10), работа с запросами и макетами. Примеры кода и проверка результата.

Символы переноса строки — частая причина проблем при обмене данными, выгрузке в Excel, формировании CSV-файлов и печатных форм в 1С. Текст, который пользователь ввёл в многострочное поле (например, адрес или комментарий), при выгрузке «ломает» структуру файла: одна запись разваливается на несколько строк, и загрузка на стороне приёмника завершается ошибкой или даёт искажённые данные.

Во встроенном языке 1С перенос строки представлен несколькими символами: перевод строки (ПС, код 10), возврат каретки (ВК, код 13) и их сочетание ВК+ПС, которое используется в Windows. Кроме того, в тексте могут встречаться неразрывные пробелы и табуляции, которые визуально неотличимы от обычных пробелов, но мешают сравнению строк. Поэтому задача «убрать переносы» обычно сводится к замене одного или нескольких служебных символов на пробел либо на пустую строку.

Ниже разобраны основные способы: функция СтрЗаменить с системным набором Символы, функция Символ() по коду, очистка в запросах, обработка многострочных полей на форме и типичные ошибки, из-за которых переносы «не удаляются».

Какие символы отвечают за перенос строки в 1С

Прежде чем удалять переносы, полезно понимать, что именно вы удаляете. В 1С доступен объект Символы, содержащий основные служебные символы: Символы.ПС — перевод строки (код 10), Символы.ВК — возврат каретки (код 13), Символы.Таб — табуляция (код 9), Символы.НПП — неразрывный пробел (код 160).

Проблема в том, что разные системы записывают конец строки по-разному. Windows-файлы используют пару ВК+ПС, Linux и многие веб-сервисы — только ПС, старые Mac-форматы — только ВК. Если текст пришёл из внешнего источника (HTTP-запрос, файл, буфер обмена), заранее неизвестно, какой вариант внутри. Поэтому надёжная очистка всегда обрабатывает оба символа, а не один из них.

Базовый способ: СтрЗаменить с Символы.ПС и Символы.ВК

Универсальный приём — последовательная замена обоих символов на пробел. Замена именно на пробел, а не на пустую строку, важна, когда перенос разделяет осмысленные части текста: если убрать перенос «в ноль», слова склеятся («Москваул. Ленина» вместо «Москва ул. Ленина»).

Функция УбратьПереносыСтрок(Знач Текст)

Результат = СтрЗаменить(Текст, Символы.ПС, " ");

Результат = СтрЗаменить(Результат, Символы.ВК, " ");

Возврат Результат;

КонецФункции

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

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

Очистка через Символ(10) и Символ(13) и удаление неразрывных пробелов

Альтернатива набору Символы — функция Символ(Код), возвращающая символ по его числовому коду. Это удобно, когда нужно удалить символы, которых нет в стандартном наборе, например неразрывный пробел с кодом 160, который часто попадает в данные при копировании из Excel или веб-страниц и ломает сравнение строк и преобразование к числу.

Результат = СтрЗаменить(Текст, Символ(10), " ");  // перевод строки

Результат = СтрЗаменить(Результат, Символ(13), " "); // возврат каретки

Результат = СтрЗаменить(Результат, Символ(160), " "); // неразрывный пробел

Результат = СокрЛП(Результат);

Такой вариант полезен при подготовке числовых и денежных полей: строка «1 250,50» с неразрывным пробелом не преобразуется в число корректно, пока символ 160 не заменён. Табуляцию (Символ(9) или Символы.Таб) также стоит заменять, если данные копировались из табличных редакторов.

Как убрать переносы строк в запросе

Когда очистку нужно выполнить массово — например, при выгрузке адресов всех контрагентов — удобнее сделать это прямо в запросе. В языке запросов 1С доступна функция Заменить (в новых версиях платформы) либо приём с подстановкой символа через параметр. Более совместимый путь — выбрать данные запросом и обработать их в цикле обхода результата тем же СтрЗаменить.

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

АдресОднойСтрокой = СтрЗаменить(Выборка.Адрес, Символы.ПС, ", ");

АдресОднойСтрокой = СтрЗаменить(АдресОднойСтрокой, Символы.ВК, "");

// далее запись в файл, таблицу значений или регистр

КонецЦикла;

Обратите внимание на приём с запятой: при выгрузке адресов и комментариев перенос часто заменяют не на пробел, а на «, » (запятую с пробелом), чтобы части адреса читались естественно. Это допустимо, пока сам файл обмена не использует запятую как разделитель полей — в CSV с разделителем-запятой такая замена сместит колонки.

Переносы строк в многострочных полях и макетах

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

Результат = "";

Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл

ТекущаяСтрока = СокрЛП(СтрПолучитьСтроку(Текст, НомерСтроки));

Если Не ПустаяСтрока(ТекущаяСтрока) Тогда

Результат = Результат + ?(Результат = "", "", "; ") + ТекущаяСтрока;

КонецЕсли;

КонецЦикла;

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

Порядок действий при выгрузке в файл
  1. 1
    Определите, какие поля могут содержать переносы: комментарии, адреса, описания, наименования
  2. 2
    Примените к каждому такому полю двойную замену Символы.ПС и Символы.ВК на пробел или подходящий разделитель
  3. 3
    Дополнительно очистите неразрывный пробел Символ(160) и табуляцию, если данные приходили из Excel или веба
  4. 4
    Сформируйте файл и откройте его в текстовом редакторе: каждая запись должна занимать ровно одну строку
  5. 5
    Загрузите тестовый файл в систему-приёмник и сверьте количество записей с источником

Проверка результата и типичные ошибки

Главный признак успешной очистки — выгруженный файл открывается в блокноте или Excel так, что одна логическая запись занимает одну строку, а количество строк совпадает с количеством записей в выборке. Если записей в файле больше, чем в базе, значит часть переносов уцелела — почти всегда это символ, который вы не обработали (обработали ПС, но не ВК, или наоборот).

Для отладки удобно проверить наличие переносов до и после обработки функцией СтрНайти: если СтрНайти(Результат, Символы.ПС) возвращает 0, переводов строки в тексте не осталось. Аналогично проверяется Символы.ВК.

Типичные ошибки
01
Замена только Символы.ПС без Символы.ВК — переносы из Windows-файлов (ВК+ПС) частично остаются, и запись продолжает разваливаться
02
Вызов СтрЗаменить без присваивания результата — функция возвращает новую строку, исходная переменная не меняется
03
Замена переноса на пустую строку вместо пробела — соседние слова склеиваются, адрес или комментарий становятся нечитаемыми
04
Замена переноса на запятую в CSV с запятой-разделителем — смещаются колонки, загрузка даёт искажённые данные
05
Игнорирование неразрывного пробела (код 160) — строки визуально одинаковые, но сравнение и преобразование к числу не работают
Контрольные точки

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

Количество строк в выгруженном файле
Норма

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

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

Строк больше — часть записей разорвана оставшимися переносами

СтрНайти(Результат, Символы.ПС) и СтрНайти(Результат, Символы.ВК)
Норма

Обе функции возвращают 0

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

Возвращают позицию символа — переносы остались

Читаемость текста после замены
Норма

Слова разделены пробелами, текст читается естественно

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

Слова склеены — перенос заменён на пустую строку вместо пробела

FAQ

Чем Символы.ПС отличается от Символы.ВК и какой из них удалять?

Символы.ПС — перевод строки (код 10), Символы.ВК — возврат каретки (код 13). В Windows конец строки — это пара ВК+ПС, в Linux и многих веб-источниках — только ПС. Удалять нужно оба: сначала один, затем другой, тогда текст из любого источника будет очищен полностью.

Как убрать перенос строки, заменив его на запятую или другой разделитель?

Используйте тот же СтрЗаменить, но с нужной строкой замены: СтрЗаменить(Текст, Символы.ПС, "; "). Учитывайте формат целевого файла: если это CSV с разделителем-точкой с запятой, внутриполевая точка с запятой сместит колонки. В таком случае выбирайте разделитель, не совпадающий с разделителем полей файла.

Почему после СтрЗаменить переносы остались на месте?

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

Как удалить переносы строк в данных, скопированных из Excel?

Помимо Символы.ПС и Символы.ВК, из Excel в текст часто попадают табуляция (Символы.Таб) и неразрывный пробел (Символ(160)). Добавьте замену этих двух символов на обычный пробел, затем примените СокрЛП. Это особенно важно для числовых полей — с неразрывным пробелом преобразование строки в число даёт ошибку или неверный результат.

Можно ли убрать переносы без программирования, например в консоли кода?

Да, если у вас есть доступ к внешней обработке «консоль кода» или вы можете выполнить произвольный код в режиме предприятия через обработку, достаточно выполнить выражение СтрЗаменить(СтрЗаменить(Текст, Символы.ПС, " "), Символы.ВК, " ") для конкретного значения. Для массовой правки данных в базе потребуется небольшая обработка с циклом — и обязательная резервная копия перед её запуском.

Как наоборот — вставить перенос строки в текст программно?

Добавьте Символы.ПС в нужное место строки: Текст = "Первая строка" + Символы.ПС + "Вторая строка". В запросах и шаблонах сообщений это тоже работает. Для отображения переноса в ячейке табличного документа убедитесь, что у ячейки включено свойство переноса текста, иначе вторая строка не будет видна.