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

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

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

Как убрать спецсимволы из строки в 1С: функции СтрЗаменить, регулярные выражения, обработка переносов строк и табуляций. Готовые примеры кода для разработчика.

Спецсимволы в строках — частая проблема при обмене данными, загрузке файлов, печати документов и выгрузке в Excel или XML. Символы переноса строки, табуляции, неразрывные пробелы и служебные знаки попадают в базу из внешних источников и ломают сравнение строк, поиск и формирование файлов.

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

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

Какие символы считаются спецсимволами и откуда они берутся

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

Чаще всего они попадают в данные при загрузке из Excel, CSV, текстовых файлов, при копировании из веб-страниц и при обмене с внешними системами. Визуально такие символы не видны, но строка «Иванов» с неразрывным пробелом не равна строке «Иванов» с обычным, и сравнение в запросе или коде даст ложный результат.

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

Удаление конкретных символов через СтрЗаменить

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

Строка = "Иванов" + Символы.ПС + "Иван" + Символы.Таб + "Иванович";

// Убираем переносы строк и табуляции

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

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

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

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

// Финальная обрезка краёв и схлопывание двойных пробелов

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

Обратите внимание на порядок: сначала заменяют управляющие символы на пробел (а не на пустую строку), если они могли разделять слова, иначе «ИвановИванович» склеится в одно слово. Возврат каретки Символы.ВК обычно идёт в паре с ПС в файлах Windows, поэтому его убирают отдельно.

Универсальная функция: оставить только буквы и цифры

Когда состав «мусорных» символов заранее неизвестен, надёжнее идти от обратного: оставить только допустимые знаки. Для этого строку перебирают посимвольно и проверяют каждый символ на вхождение в строку-шаблон разрешённых символов.

Функция УбратьСпецсимволы(ИсходнаяСтрока) Экспорт

Допустимые = "abcdefghijklmnopqrstuvwxyz"

+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

+ "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"

+ "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"

+ "0123456789";

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

Для Позиция = 1 По СтрДлина(ИсходнаяСтрока) Цикл

ТекущийСимвол = Сред(ИсходнаяСтрока, Позиция, 1);

Если Найти(Допустимые, ТекущийСимвол) > 0 Тогда

Результат = Результат + ТекущийСимвол;

КонецЕсли;

КонецЦикла;

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

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

Такой подход безопасен: всё, что не входит в белый список, отбрасывается автоматически, включая редкие Unicode-символы. Если нужно сохранить пробелы, дефисы или другие знаки — просто добавьте их в строку Допустимые.

Недостаток метода — скорость на очень длинных строках: конкатенация в цикле работает медленнее, чем пакетная замена. Для строк в десятки тысяч символов имеет смысл собирать результат через массив и СтрСоединить либо использовать регулярные выражения.

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

Регулярные выражения через VBScript.RegExp

На сервере или толстом клиенте под Windows доступен COM-объект VBScript.RegExp, который позволяет очистить строку одним вызовом. Это самый компактный и быстрый вариант для сложных шаблонов.

Функция ОчиститьРегулярнымВыражением(ИсходнаяСтрока)

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.Global = Истина;

RegExp.IgnoreCase = Истина;

// Удаляем всё, кроме букв, цифр и пробела

RegExp.Pattern = "[^а-яёa-z0-9 ]";

Возврат RegExp.Replace(ИсходнаяСтрока, "");

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

Шаблон [^а-яёa-z0-9 ] читается как «любой символ, не входящий в перечисленные». Букву «ё» нужно указывать явно — диапазон а-я её не включает. Это одна из самых частых причин «потери» букв при очистке русских строк.

Ограничение способа существенное: COM-объект недоступен на Linux-сервере, в веб-клиенте и на мобильной платформе. Если конфигурация должна работать кроссплатформенно, используйте посимвольный перебор или обработку на сервере с проверкой окружения.

Удаление неразрывных пробелов и «невидимого мусора»

Неразрывный пробел (код 160) — главный виновник «фантомных» различий строк. Он выглядит как обычный пробел, но СокрЛП и сравнение строк воспринимают его иначе. Особенно часто он приходит из Excel, где числа форматируются с разделителями разрядов.

// Убираем неразрывный пробел и другие невидимые символы

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

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

Результат = СтрЗаменить(Результат, Символ(65279), ""); // BOM из начала файла

Чтобы найти, какой именно символ портит строку, полезно вывести коды всех символов проблемного участка:

Для Позиция = 1 По СтрДлина(Строка) Цикл

Сообщить(Строка(Позиция) + ": код " + КодСимвола(Строка, Позиция));

КонецЦикла;

Функция КодСимвола возвращает код Unicode символа в указанной позиции. Получив код, вы точно знаете, с чем бороться, и добавляете нужную замену в свою функцию очистки.

Типичные ошибки
01
Попытка убрать переносы строк функцией СокрЛП — она обрезает только края строки, символы внутри остаются
02
Забытая буква «ё» в шаблоне регулярного выражения — слова с «ё» теряют буквы после очистки
03
Замена разделителей на пустую строку вместо пробела — соседние слова склеиваются в одно
04
Использование COM-объекта RegExp без проверки платформы — код падает на Linux-сервере

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

На практике спецсимволы чаще всего убирают не поодиночке, а в составе процедур загрузки: из Excel через табличный документ, из CSV построчно, из XML при чтении узлов. Правильное место для очистки — сразу после получения значения, до записи в объект базы или сравнения с существующими данными.

Для строк, идущих в запросы (например, поиск контрагента по наименованию), очистку выполняют на обеих сторонах сравнения: и в загружаемом значении, и при выборке из базы. Иначе «ООО Ромашка» из файла не совпадёт с «ООО Ромашка» в справочнике из-за двойного пробела или табуляции.

При выгрузке в XML и JSON отдельная забота — символы, недопустимые в XML 1.0 (управляющие коды до 32, кроме табуляции и переводов строк). Если такой символ попадёт в файл, парсер на стороне получателя откажется его читать. Перед записью значений в XML их стоит прогонять через функцию очистки управляющих символов.

Маршрут решения

Как выбрать способ очистки

Известен конкретный мешающий символ (перенос, табуляция, НПП)Используйте СтрЗаменить с этим символом — быстро и наглядно
Состав мусора неизвестен, нужна надёжная очисткаПрименяйте белый список: посимвольный перебор с проверкой по строке допустимых
Сервер Windows и сложный шаблон очисткиИспользуйте VBScript.RegExp с шаблоном исключения
Код должен работать в веб-клиенте и на LinuxТолько встроенные функции: СтрЗаменить, посимвольный перебор, без COM-объектов

Проверка результата и контроль качества

После очистки убедитесь, что результат соответствует ожиданиям. Минимальный набор проверок: длина строки уменьшилась предсказуемо, сравнение с эталонным значением даёт Истина, в строке не осталось символов с кодами ниже 32 (кроме допустимых).

// Проверка: есть ли в строке управляющие символы

Функция ЕстьСпецсимволы(Строка)

Для Позиция = 1 По СтрДлина(Строка) Цикл

Код = КодСимвола(Строка, Позиция);

Если Код < 32 Или Код = 160 Тогда

Возврат Истина;

КонецЕсли;

КонецЦикла;

Возврат Ложь;

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

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

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

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

Сравнение очищенной строки с эталоном
Норма

Сравнение возвращает Истина

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

Строки визуально одинаковы, но сравнение даёт Ложь — остался невидимый символ

Коды символов через КодСимвола()
Норма

Все коды в ожидаемом диапазоне букв и цифр

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

Встречаются коды ниже 32 или 160

Длина строки до и после
Норма

Уменьшение соответствует числу удалённых символов

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

Строка сильно короче — удалено лишнее, проверьте белый список

Часто задаваемые вопросы

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

Используйте СтрЗаменить(Строка, Символы.ПС, " "). Если данные пришли из файла Windows, дополнительно уберите возврат каретки: СтрЗаменить(Результат, Символы.ВК, ""). Заменяйте на пробел, если перенос разделял слова, иначе они склеятся.

Почему СокрЛП не убирает переносы и табуляцию?

СокрЛП удаляет только незначащие символы в начале и конце строки. Переносы строк и табуляции в середине текста она не затрагивает — для них нужна явная замена через СтрЗаменить.

Как удалить неразрывный пробел?

Замените символ с кодом 160: СтрЗаменить(Строка, Символ(160), " ") или через Символы.НПП. Визуально неразрывный пробел неотличим от обычного, поэтому подозрение на него возникает, когда внешне одинаковые строки не равны при сравнении.

Как оставить в строке только цифры?

Переберите строку посимвольно и оставьте символы, для которых Найти("0123456789", Символ) > 0. Альтернатива на сервере Windows — регулярное выражение с шаблоном "[^0-9]" через VBScript.RegExp.

Работает ли VBScript.RegExp в веб-клиенте и на Linux?

Нет. COM-объект доступен только в среде Windows на толстом или тонком клиенте и на Windows-сервере. Для кроссплатформенного кода используйте СтрЗаменить или посимвольный перебор встроенными средствами языка.

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

Пройдите по строке циклом и выведите КодСимвола(Строка, Позиция) для каждой позиции. По коду Unicode вы точно определите проблемный знак и добавите соответствующую замену в функцию очистки.

Итог

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

Для удаления известных символов используйте СтрЗаменить с Символы.ПС, Символы.Таб и Символ(160). Для полной очистки надёжнее белый список допустимых символов. Регулярные выражения через VBScript.RegExp работают только на Windows. Перед выбором способа выясните коды мешающих символов через КодСимвола(), а после очистки проверьте результат сравнением с эталоном.