Разработка и Конфигурация · 10 мин
Как убрать перенос строки в 1С программно
Как убрать перенос строки в 1С программно: СтрЗаменить с Символы.ПС и Символы.ВК, обработка многострочных строк, очистка данных при обмене и печати.
Переносы строк в текстовых данных — частая причина проблем в 1С: «ломается» выгрузка в CSV, печатная форма выглядит криво, сравнение строк даёт ложный результат, а запрос по наименованию не находит нужный элемент. Чаще всего переносы попадают в базу при копировании из Excel, импорте из внешних систем или ручном вводе многострочных полей.
Во встроенном языке 1С перенос строки — это обычный символ (или пара символов), поэтому убрать его можно стандартными средствами: функцией СтрЗаменить() с системным набором Символы, методами работы с многострочными строками или регулярными выражениями через внешние компоненты. Выбор способа зависит от того, откуда пришёл перенос и что должно остаться вместо него — пробел, пустота или другой разделитель.
Важный нюанс: в Windows перенос строки обычно состоит из двух символов — возврата каретки (ВК, код 13) и перевода строки (ПС, код 10), а в Linux и при обмене данными часто встречается только ПС. Если заменить лишь один из них, «невидимый» остаток продолжит портить данные. Ниже разобраны рабочие приёмы с готовым кодом и способы проверить результат.
Откуда в данных берутся переносы строк
Понимание источника переноса помогает выбрать правильный метод очистки. Самый частый случай — копирование текста из Excel или Word: ячейки с многострочным содержимым приносят с собой символы ПС и ВК. Второй источник — обмен данными: XML, JSON и текстовые файлы из внешних систем могут содержать только символ ПС без ВК, если файл сформирован в Linux-среде.
Третий источник — сами пользователи: поля «Комментарий», «Описание», «Адрес» часто заполняются с нажатиями Enter. Наконец, переносы появляются при программной сборке строк через Символы.ПС — например, при формировании адреса из нескольких частей, после чего эта строка попадает в печатную форму или файл выгрузки, где перенос недопустим.
Заменяйте оба символа: Символы.ВК и Символы.ПС
Достаточно замены Символы.ПС, но ВК стоит обработать про запас
Проверьте свойство «Размещение» и ширину колонки макета
Базовый способ: СтрЗаменить с Символы.ПС
Основной инструмент — функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Она заменяет все вхождения подстроки и не трогает исходную переменную, а возвращает новую строку. В качестве подстроки поиска используется системное перечисление Символы.ПС — символ перевода строки.
ИсходнаяСтрока = "Первая строка" + Символы.ПС + "Вторая строка";
Результат = СтрЗаменить(ИсходнаяСтрока, Символы.ПС, " ");
// Результат: "Первая строка Вторая строка"
Третьим параметром обычно передают пробел, а не пустую строку: если убрать перенос «в никуда», слова на стыке строк склеятся («строкаВторая»). Пустая строка оправдана только тогда, когда перенос стоит внутри одного слова или числа — например, при выгрузке длинных значений из Excel.
Учтите, что Символы.ПС — это один символ с кодом 10. Если в данных встречается классическая Windows-пара ВК+ПС, после замены только ПС в строке останется невидимый символ ВК, который будет мешать сравнению строк и выглядеть как «лишний» признак при посимвольном разборе.
Полная очистка: обработка ВК, ПС и табуляции
Надёжный приём — убрать оба символа переноса, а затем нормализовать пробелы. Порядок замен не критичен, но логично сначала удалить ВК, затем ПС, и в конце применить СокрЛП() для обрезки краевых пробелов.
Функция УбратьПереносыСтрок(Знач Текст)
Результат = СтрЗаменить(Текст, Символы.ВК, "");
Результат = СтрЗаменить(Результат, Символы.ПС, " ");
Результат = СтрЗаменить(Результат, Символы.Таб, " ");
Возврат СокрЛП(Результат);
КонецФункции
Такую функцию удобно один раз разместить в общем модуле и вызывать при записи данных, формировании печатных форм и выгрузках. Если в строке могут встречаться двойные пробелы после замены, добавьте цикл с заменой двух пробелов на один до тех пор, пока СтрНайти(Результат, " ") возвращает значение больше нуля.
Результат = СтрЗаменить(СтрЗаменить(Текст, Символы.ВК, ""), Символы.ПС, " ");Для нестроковых значений (числа, даты), которые почему-то содержат переносы после преобразования, сначала приведите значение к строке через Строка(Значение) или Формат(), а затем применяйте ту же цепочку замен.
Работа с многострочными строками: СтрЧислоСтрок и СтрПолучитьСтроку
Иногда перенос нужно не просто удалить, а осмысленно обработать: взять первую строку адреса, склеить строки через запятую или отфильтровать пустые. Для этого во встроенном языке есть пара функций: СтрЧислоСтрок() возвращает количество строк в тексте, а СтрПолучитьСтроку(Текст, Номер) — конкретную строку по номеру.
Части = "";
Для Номер = 1 По СтрЧислоСтрок(Текст) Цикл
ТекущаяСтрока = СокрЛП(СтрПолучитьСтроку(Текст, Номер));
Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
Части = Части + ?(Части = "", "", ", ") + ТекущаяСтрока;
КонецЕсли;
КонецЦикла;
Этот подход длиннее простой замены, но даёт контроль: пустые строки отбрасываются, разделитель можно выбрать любой, а каждую часть при необходимости обработать отдельно. Он особенно полезен при склейке многострочных адресов и комментариев для выгрузки в системы, где переносы запрещены форматом.
Обратная задача — добавить переносы — решается через СтрСоединить() с разделителем Символы.ПС для массива строк. Это удобно, когда данные хранятся «плоско», а в печатной форме их нужно вывести столбиком.
Сравнение способов убрать перенос
Самый быстрый и простой вариант. Подходит для массовой очистки, но не управляет разделителями и пустыми строками
Полный контроль над каждой строкой, можно выбрать разделитель и отфильтровать пустые. Кода больше
Удобен при обработке файлов целиком: чтение, замена, запись. Избыточен для одиночных полей
Удаление переносов при обмене файлами и в запросах
При выгрузке в CSV или текстовый файл перенос внутри поля разрывает структуру строки файла, и принимающая система получает «развалившуюся» запись. Перед записью в файл через ТекстовыйДокумент или ЗаписьТекста прогоняйте каждое поле через функцию очистки, показанную выше, либо экранируйте значение по правилам формата.
В запросах возможности ограничены: функции СтрЗаменить в языке запросов нет. Если нужно найти записи с переносами, используйте конструкцию ПОДОБНО с символом переноса через параметр, либо выгрузите результат и обработайте его в коде. Для сравнения строк без учёта переносов надёжнее очистить обе сравниваемые строки в коде, чем пытаться сделать это запросом.
При загрузке из Excel через табличный документ переносы внутри ячеек читаются как есть. Очищайте значение сразу после ТабДок.Область(...).Текст, до записи в базу — так «мусор» не попадёт в реквизиты и не придётся чистить базу потом.
Проверка результата и типичные ошибки
Проверить, остались ли переносы, можно через СтрЧислоСтрок(Результат): для корректно очищенной строки функция вернёт 1. Дополнительно полезно поискать коды символов напрямую: СтрНайти(Результат, Символ(10)) и СтрНайти(Результат, Символ(13)) должны вернуть 0.
Как проверить результат
Возвращает 1
Возвращает больше 1 — переносы остались
Оба поиска возвращают 0
Найден код 13 — забыли обработать Символы.ВК
Слова разделены одиночными пробелами
Слова склеены или двойные пробелы — неверно выбрана строка замены
Отдельная ошибка — путать перенос строки с автоматическим переносом текста в ячейке табличного документа. Если в печатной форме текст «переходит» на новую строку, но СтрЧислоСтрок возвращает 1, проблема не в данных, а в ширине колонки макета или свойстве размещения текста. В этом случае очистка строки ничего не даст — нужно править макет.
Что важно запомнить
Перенос строки в 1С убирается через СтрЗаменить с Символы.ПС и обязательной обработкой Символы.ВК. Замену делайте на пробел, а не на пустоту, результат присваивайте переменной и проверяйте через СтрЧислоСтрок. Для управляемой склейки используйте СтрПолучитьСтроку, а массовую чистку данных проводите только после теста на копии.
Частые вопросы
Чем Символы.ПС отличается от Символы.ВК?
Символы.ПС — это перевод строки (код 10), Символы.ВК — возврат каретки (код 13). В Windows перенос строки — это пара ВК+ПС, в Linux и во многих форматах обмена — только ПС. Поэтому при очистке данных из разных источников обрабатывайте оба символа.
Как убрать переносы строк в запросе 1С?
Функции замены подстроки в языке запросов нет. Практичные варианты: выгрузить результат запроса и очистить строки в коде через СтрЗаменить, либо найти записи с переносами через ПОДОБНО с параметром, содержащим символ переноса, а затем обработать их программно.
Почему после СтрЗаменить строка не изменилась?
СтрЗаменить возвращает новую строку, а не изменяет исходную переменную. Результат нужно присвоить: Текст = СтрЗаменить(Текст, Символы.ПС, " "). Вторая возможная причина — в данных перенос задан парой ВК+ПС, а заменён был только ПС: тогда невидимый символ ВК остаётся.
Как убрать переносы в многострочном поле формы при вводе пользователем?
Обработайте значение в событии «ПриИзменении» или перед записью объекта: примените цепочку СтрЗаменить с Символы.ВК и Символы.ПС. Если поле в принципе не должно быть многострочным, дополнительно проверьте свойство поля формы «МногострочныйРежим» — при его отключении ввод переноса станет невозможен.
Как заменить перенос строки на запятую или другой разделитель?
Передайте нужный разделитель третьим параметром: СтрЗаменить(Текст, Символы.ПС, ", "). Если в тексте могут быть пустые строки, которые дадут лишние запятые, используйте перебор через СтрЧислоСтрок и СтрПолучитьСтроку с проверкой ПустаяСтрока для каждой части.
Можно ли убрать переносы во всех строковых реквизитах базы сразу?
Теоретически — да, универсальной обработкой с перебором метаданных и заменой через СтрЗаменить. На практике делайте это только на копии: сначала сформируйте список затронутых объектов без записи, оцените объём изменений, затем выполняйте запись порциями в транзакциях. Некоторые поля (например, тексты писем или описания для печати) могут требовать сохранения переносов — исключите их из обработки.