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

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

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

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

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

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

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

Откуда в данных берутся переносы строк

Понимание источника переноса помогает выбрать правильный метод очистки. Самый частый случай — копирование текста из Excel или Word: ячейки с многострочным содержимым приносят с собой символы ПС и ВК. Второй источник — обмен данными: XML, JSON и текстовые файлы из внешних систем могут содержать только символ ПС без ВК, если файл сформирован в Linux-среде.

Третий источник — сами пользователи: поля «Комментарий», «Описание», «Адрес» часто заполняются с нажатиями Enter. Наконец, переносы появляются при программной сборке строк через Символы.ПС — например, при формировании адреса из нескольких частей, после чего эта строка попадает в печатную форму или файл выгрузки, где перенос недопустим.

Строка пришла из Excel/WordСкорее всего ВК+ПС

Заменяйте оба символа: Символы.ВК и Символы.ПС

Данные из файла обмена (XML, JSON, CSV)Часто только ПС

Достаточно замены Символы.ПС, но ВК стоит обработать про запас

Перенос появляется только в печатной формеВозможно, это не символ, а формат ячейки

Проверьте свойство «Размещение» и ширину колонки макета

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

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

ИсходнаяСтрока = "Первая строка" + Символы.ПС + "Вторая строка";

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

// Результат: "Первая строка Вторая строка"

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

Учтите, что Символы.ПС — это один символ с кодом 10. Если в данных встречается классическая Windows-пара ВК+ПС, после замены только ПС в строке останется невидимый символ ВК, который будет мешать сравнению строк и выглядеть как «лишний» признак при посимвольном разборе.

Полная очистка: обработка ВК, ПС и табуляции

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

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

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

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

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

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

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

Такую функцию удобно один раз разместить в общем модуле и вызывать при записи данных, формировании печатных форм и выгрузках. Если в строке могут встречаться двойные пробелы после замены, добавьте цикл с заменой двух пробелов на один до тех пор, пока СтрНайти(Результат, " ") возвращает значение больше нуля.

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

Для нестроковых значений (числа, даты), которые почему-то содержат переносы после преобразования, сначала приведите значение к строке через Строка(Значение) или Формат(), а затем применяйте ту же цепочку замен.

Работа с многострочными строками: СтрЧислоСтрок и СтрПолучитьСтроку

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

Части = "";

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

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

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

Части = Части + ?(Части = "", "", ", ") + ТекущаяСтрока;

КонецЕсли;

КонецЦикла;

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

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

Сравнение способов убрать перенос

СтрЗаменить + Символы.ПС/ВК

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

СтрЧислоСтрок + СтрПолучитьСтроку

Полный контроль над каждой строкой, можно выбрать разделитель и отфильтровать пустые. Кода больше

ТекстовыйДокумент

Удобен при обработке файлов целиком: чтение, замена, запись. Избыточен для одиночных полей

Удаление переносов при обмене файлами и в запросах

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

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

При загрузке из Excel через табличный документ переносы внутри ячеек читаются как есть. Очищайте значение сразу после ТабДок.Область(...).Текст, до записи в базу — так «мусор» не попадёт в реквизиты и не придётся чистить базу потом.

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

Проверить, остались ли переносы, можно через СтрЧислоСтрок(Результат): для корректно очищенной строки функция вернёт 1. Дополнительно полезно поискать коды символов напрямую: СтрНайти(Результат, Символ(10)) и СтрНайти(Результат, Символ(13)) должны вернуть 0.

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

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

СтрЧислоСтрок(Результат)
Норма

Возвращает 1

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

Возвращает больше 1 — переносы остались

СтрНайти по Символ(10) и Символ(13)
Норма

Оба поиска возвращают 0

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

Найден код 13 — забыли обработать Символы.ВК

Визуальный контроль строки
Норма

Слова разделены одиночными пробелами

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

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

Типичные ошибки
01
{'name': 'Замена только Символы.ПС', 'text': 'В Windows-данных остаётся символ ВК, строки не сравниваются и «невидимо» отличаются'}
02
{'name': 'Замена переноса на пустую строку', 'text': 'Слова на стыке строк склеиваются: «Иванов Иван» превращается в «ИвановИван»'}
03
{'name': 'Присвоение без возврата результата', 'text': 'СтрЗаменить не меняет исходную переменную — результат нужно присвоить: Текст = СтрЗаменить(Текст, ...)'}
04
{'name': 'Очистка только при выгрузке', 'text': 'Переносы остаются в базе и всплывают в печатных формах и отчётах — чистите данные при записи'}

Отдельная ошибка — путать перенос строки с автоматическим переносом текста в ячейке табличного документа. Если в печатной форме текст «переходит» на новую строку, но СтрЧислоСтрок возвращает 1, проблема не в данных, а в ширине колонки макета или свойстве размещения текста. В этом случае очистка строки ничего не даст — нужно править макет.

Итог

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

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

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

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

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

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

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

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

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

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

Обработайте значение в событии «ПриИзменении» или перед записью объекта: примените цепочку СтрЗаменить с Символы.ВК и Символы.ПС. Если поле в принципе не должно быть многострочным, дополнительно проверьте свойство поля формы «МногострочныйРежим» — при его отключении ввод переноса станет невозможен.

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

Передайте нужный разделитель третьим параметром: СтрЗаменить(Текст, Символы.ПС, ", "). Если в тексте могут быть пустые строки, которые дадут лишние запятые, используйте перебор через СтрЧислоСтрок и СтрПолучитьСтроку с проверкой ПустаяСтрока для каждой части.

Можно ли убрать переносы во всех строковых реквизитах базы сразу?

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