Разработка и Конфигурация · 11 мин
Как убрать спецсимволы из строки в 1С
Как убрать спецсимволы из строки в 1С: функции СтрЗаменить, регулярные выражения, обработка переносов строк и табуляций. Готовые примеры кода для разработчика.
Спецсимволы в строках — частая проблема при обмене данными, загрузке файлов, печати документов и выгрузке в Excel или XML. Символы переноса строки, табуляции, неразрывные пробелы и служебные знаки попадают в базу из внешних источников и ломают сравнение строк, поиск и формирование файлов.
Во встроенном языке 1С нет единой функции «очистить строку», поэтому задачу решают комбинацией стандартных средств: СтрЗаменить, работа с объектом Символы, посимвольный разбор и регулярные выражения через COM-объект. Выбор способа зависит от того, какие именно символы нужно убрать и где выполняется код — на тонком клиенте, сервере или в веб-клиенте.
Ниже разобраны рабочие варианты очистки: от простой замены конкретных символов до универсальной функции, оставляющей только буквы и цифры. Все примеры можно копировать в общий модуль и адаптировать под свою задачу.
Какие символы считаются спецсимволами и откуда они берутся
Под спецсимволами обычно понимают управляющие и невидимые знаки: перенос строки (ПС, код 10), возврат каретки (ВК, код 13), табуляцию (код 9), неразрывный пробел (НПП, код 160), а также знаки пунктуации и служебные символы вроде кавычек, слэшей и вертикальной черты.
Чаще всего они попадают в данные при загрузке из Excel, CSV, текстовых файлов, при копировании из веб-страниц и при обмене с внешними системами. Визуально такие символы не видны, но строка «Иванов» с неразрывным пробелом не равна строке «Иванов» с обычным, и сравнение в запросе или коде даст ложный результат.
Платформа 1С предоставляет системное перечисление Символы, через которое доступны основные управляющие знаки: Символы.ПС, Символы.ВК, Символы.Таб, Символы.НПП, Символы.ВТаб, Символы.ПФ. Произвольный символ по коду Unicode получают функцией Символ(Код).
Удаление конкретных символов через СтрЗаменить
Самый прямой способ — функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Чтобы убрать символ, заменяют его на пустую строку. Метод подходит, когда известно, какие именно символы нужно удалить.
Строка = "Иванов" + Символы.ПС + "Иван" + Символы.Таб + "Иванович";
// Убираем переносы строк и табуляции
Результат = СтрЗаменить(Строка, Символы.ПС, " ");
Результат = СтрЗаменить(Результат, Символы.ВК, "");
Результат = СтрЗаменить(Результат, Символы.Таб, " ");
Результат = СтрЗаменить(Результат, Символы.НПП, " ");
// Финальная обрезка краёв и схлопывание двойных пробелов
Результат = СокрЛП(Результат);
Обратите внимание на порядок: сначала заменяют управляющие символы на пробел (а не на пустую строку), если они могли разделять слова, иначе «ИвановИванович» склеится в одно слово. Возврат каретки Символы.ВК обычно идёт в паре с ПС в файлах Windows, поэтому его убирают отдельно.
Универсальная функция: оставить только буквы и цифры
Когда состав «мусорных» символов заранее неизвестен, надёжнее идти от обратного: оставить только допустимые знаки. Для этого строку перебирают посимвольно и проверяют каждый символ на вхождение в строку-шаблон разрешённых символов.
Функция УбратьСпецсимволы(ИсходнаяСтрока) Экспорт
Допустимые = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
+ "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
+ "0123456789";
Результат = "";
Для Позиция = 1 По СтрДлина(ИсходнаяСтрока) Цикл
ТекущийСимвол = Сред(ИсходнаяСтрока, Позиция, 1);
Если Найти(Допустимые, ТекущийСимвол) > 0 Тогда
Результат = Результат + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Такой подход безопасен: всё, что не входит в белый список, отбрасывается автоматически, включая редкие Unicode-символы. Если нужно сохранить пробелы, дефисы или другие знаки — просто добавьте их в строку Допустимые.
Недостаток метода — скорость на очень длинных строках: конкатенация в цикле работает медленнее, чем пакетная замена. Для строк в десятки тысяч символов имеет смысл собирать результат через массив и СтрСоединить либо использовать регулярные выражения.
- 1Определите, какие символы мешают: выведите коды через КодСимвола() для подозрительных позиций
- 2Выберите способ: точечная замена через СтрЗаменить или белый список с посимвольным перебором
- 3Напишите функцию в общем модуле и проверьте её на реальных данных с проблемными строками
- 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 символа в указанной позиции. Получив код, вы точно знаете, с чем бороться, и добавляете нужную замену в свою функцию очистки.
Очистка при загрузке файлов и обмене данными
На практике спецсимволы чаще всего убирают не поодиночке, а в составе процедур загрузки: из Excel через табличный документ, из CSV построчно, из XML при чтении узлов. Правильное место для очистки — сразу после получения значения, до записи в объект базы или сравнения с существующими данными.
Для строк, идущих в запросы (например, поиск контрагента по наименованию), очистку выполняют на обеих сторонах сравнения: и в загружаемом значении, и при выборке из базы. Иначе «ООО Ромашка» из файла не совпадёт с «ООО Ромашка» в справочнике из-за двойного пробела или табуляции.
При выгрузке в XML и JSON отдельная забота — символы, недопустимые в XML 1.0 (управляющие коды до 32, кроме табуляции и переводов строк). Если такой символ попадёт в файл, парсер на стороне получателя откажется его читать. Перед записью значений в XML их стоит прогонять через функцию очистки управляющих символов.
Как выбрать способ очистки
Проверка результата и контроль качества
После очистки убедитесь, что результат соответствует ожиданиям. Минимальный набор проверок: длина строки уменьшилась предсказуемо, сравнение с эталонным значением даёт Истина, в строке не осталось символов с кодами ниже 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. Перед выбором способа выясните коды мешающих символов через КодСимвола(), а после очистки проверьте результат сравнением с эталоном.