Разработка и Конфигурация · 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Определите, какие поля могут содержать переносы: комментарии, адреса, описания, наименования
- 2Примените к каждому такому полю двойную замену Символы.ПС и Символы.ВК на пробел или подходящий разделитель
- 3Дополнительно очистите неразрывный пробел Символ(160) и табуляцию, если данные приходили из Excel или веба
- 4Сформируйте файл и откройте его в текстовом редакторе: каждая запись должна занимать ровно одну строку
- 5Загрузите тестовый файл в систему-приёмник и сверьте количество записей с источником
Проверка результата и типичные ошибки
Главный признак успешной очистки — выгруженный файл открывается в блокноте или Excel так, что одна логическая запись занимает одну строку, а количество строк совпадает с количеством записей в выборке. Если записей в файле больше, чем в базе, значит часть переносов уцелела — почти всегда это символ, который вы не обработали (обработали ПС, но не ВК, или наоборот).
Для отладки удобно проверить наличие переносов до и после обработки функцией СтрНайти: если СтрНайти(Результат, Символы.ПС) возвращает 0, переводов строки в тексте не осталось. Аналогично проверяется Символы.ВК.
Как проверить результат
Совпадает с числом записей в выборке из базы
Строк больше — часть записей разорвана оставшимися переносами
Обе функции возвращают 0
Возвращают позицию символа — переносы остались
Слова разделены пробелами, текст читается естественно
Слова склеены — перенос заменён на пустую строку вместо пробела
FAQ
Чем Символы.ПС отличается от Символы.ВК и какой из них удалять?
Символы.ПС — перевод строки (код 10), Символы.ВК — возврат каретки (код 13). В Windows конец строки — это пара ВК+ПС, в Linux и многих веб-источниках — только ПС. Удалять нужно оба: сначала один, затем другой, тогда текст из любого источника будет очищен полностью.
Как убрать перенос строки, заменив его на запятую или другой разделитель?
Используйте тот же СтрЗаменить, но с нужной строкой замены: СтрЗаменить(Текст, Символы.ПС, "; "). Учитывайте формат целевого файла: если это CSV с разделителем-точкой с запятой, внутриполевая точка с запятой сместит колонки. В таком случае выбирайте разделитель, не совпадающий с разделителем полей файла.
Почему после СтрЗаменить переносы остались на месте?
Две самые частые причины: результат функции не присвоен переменной (СтрЗаменить возвращает новую строку, а не меняет исходную), либо обработан только один символ — ПС или ВК, а в тексте присутствует другой. Проверьте текст функцией СтрНайти по обоим символам.
Как удалить переносы строк в данных, скопированных из Excel?
Помимо Символы.ПС и Символы.ВК, из Excel в текст часто попадают табуляция (Символы.Таб) и неразрывный пробел (Символ(160)). Добавьте замену этих двух символов на обычный пробел, затем примените СокрЛП. Это особенно важно для числовых полей — с неразрывным пробелом преобразование строки в число даёт ошибку или неверный результат.
Можно ли убрать переносы без программирования, например в консоли кода?
Да, если у вас есть доступ к внешней обработке «консоль кода» или вы можете выполнить произвольный код в режиме предприятия через обработку, достаточно выполнить выражение СтрЗаменить(СтрЗаменить(Текст, Символы.ПС, " "), Символы.ВК, " ") для конкретного значения. Для массовой правки данных в базе потребуется небольшая обработка с циклом — и обязательная резервная копия перед её запуском.
Как наоборот — вставить перенос строки в текст программно?
Добавьте Символы.ПС в нужное место строки: Текст = "Первая строка" + Символы.ПС + "Вторая строка". В запросах и шаблонах сообщений это тоже работает. Для отображения переноса в ячейке табличного документа убедитесь, что у ячейки включено свойство переноса текста, иначе вторая строка не будет видна.