Разработка и Конфигурация · 10 мин
Как убрать лишние символы в строке в 1С
Как убрать лишние символы из строки в 1С: СокрЛП, СтрЗаменить, удаление пробелов, переводов строк и спецсимволов. Примеры кода и типичные ошибки.
Лишние символы в строках — постоянная проблема при обмене данными, загрузке файлов, вводе информации пользователями и интеграции с внешними системами. Пробелы по краям, двойные пробелы внутри, переводы строк, табуляции, неразрывные пробелы и служебные символы мешают поиску, сравнению и корректной записи данных в базу.
Во встроенном языке 1С нет единой функции «убрать все лишнее», поэтому задача решается комбинацией штатных средств: СокрЛП(), СтрЗаменить(), работой с символами по кодам и регулярными выражениями через COM-объект. Выбор способа зависит от того, какие именно символы нужно удалить и откуда они взялись.
Ниже разобраны основные сценарии с готовыми примерами кода: от простой обрезки пробелов до очистки строки от всех символов, кроме цифр и букв. Все примеры работают как в обычных, так и в управляемых формах, если не указано иное.
Обрезка пробелов по краям: СокрЛ, СокрП, СокрЛП
Самая частая задача — убрать пробелы в начале и в конце строки. Для этого в 1С есть три функции: СокрЛ() удаляет пробелы слева, СокрП() — справа, СокрЛП() — с обеих сторон. Чаще всего используется именно последняя.
Строка = " ООО Ромашка ";
Результат = СокрЛП(Строка); // "ООО Ромашка"
Важно понимать ограничение: СокрЛП() удаляет только обычные пробелы, символы табуляции и переводы строк по краям. Неразрывный пробел (код 160), который часто приходит из Excel и веб-страниц, эта функция не трогает. Если после обрезки строка визуально «все равно с пробелом», почти наверняка это неразрывный пробел.
Также функции семейства Сокр не затрагивают пробелы внутри строки. Строка «Иванов Иван» с двойным пробелом посередине останется неизменной — для такой очистки нужен другой подход, описанный ниже.
Удаление конкретных символов через СтрЗаменить
Универсальный способ убрать любой известный символ — заменить его на пустую строку функцией СтрЗаменить(). Функция принимает исходную строку, подстроку поиска и подстроку замены, и обрабатывает все вхождения сразу.
// Удаление неразрывного пробела
Строка = СтрЗаменить(Строка, Символ(160), "");
// Удаление табуляции
Строка = СтрЗаменить(Строка, Символы.Таб, "");
// Удаление переводов строк
Строка = СтрЗаменить(Строка, Символы.ПС, " ");
Строка = СтрЗаменить(Строка, Символы.ВК, "");
// Удаление конкретного знака, например дефисов
Строка = СтрЗаменить(Строка, "-", "");
Обратите внимание на третий параметр: при удалении переводов строк часто лучше заменять их на обычный пробел, а не на пустоту. Иначе слова «склеятся»: «Первая строкаВторая строка». Для знаков препинания и спецсимволов замена на пустую строку обычно безопасна.
Объект Символы содержит предопределенные константы: ПС (перевод строки), ВК (возврат каретки), Таб (табуляция), НПП (неразрывный пробел). Использование Символы.НПП читается лучше, чем Символ(160), хотя результат идентичен.
Строка = СокрЛП(СтрЗаменить(СтрЗаменить(Строка, Символы.НПП, " "), Символы.Таб, " "));Схлопывание повторных пробелов внутри строки
Двойные и тройные пробелы внутри текста появляются при ручном вводе и при склейке строк. Простая замена двойного пробела на одинарный за один проход не гарантирует результат: три пробела подряд превратятся в два. Поэтому замену выполняют в цикле до тех пор, пока двойные пробелы не исчезнут.
Пока СтрНайти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
Такой цикл безопасен: он завершается, как только в строке не остается двойных пробелов. Но предварительно стоит заменить табуляции и неразрывные пробелы на обычные пробелы — иначе комбинация «пробел + табуляция» останется необработанной.
Для очень длинных строк многократный вызов СтрЗаменить() в цикле может работать медленно, так как каждый вызов создает новую строку. На практике это заметно только при обработке текстов объемом в сотни килобайт и выше — для обычных наименований, адресов и номеров проблем нет.
Очистка строки по шаблону: оставить только нужные символы
Когда нужно оставить в строке только цифры (например, извлечь телефон или ИНН) либо только буквы и цифры, перечислять все удаляемые символы неудобно. Проще пройти по строке посимвольно и собрать новую строку из разрешенных знаков.
Функция ОставитьТолькоЦифры(Знач Строка)
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Код = КодСимвола(Символ);
Если Код >= 48 И Код <= 57 Тогда // 0-9
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Коды символов для проверки: 48–57 — цифры, 65–90 — латинские заглавные, 97–122 — латинские строчные, 1040–1103 — кириллица, 1025 и 1105 — буква Ё. Комбинируя диапазоны, можно задать любой допустимый алфавит.
Альтернативный подход — функция СтрЧислоВхождений() совместно с перебором, но посимвольная сборка остается самым прозрачным и предсказуемым вариантом. Для тонкого клиента без вызова сервера такая функция тоже работает, поскольку использует только базовые операторы языка.
- 1Определите, какие символы лишние: пробелы, переводы строк, спецсимволы
- 2Замените неразрывные пробелы и табуляции на обычные пробелы
- 3Схлопните повторные пробелы циклом СтрЗаменить
- 4Примените СокрЛП для обрезки по краям
- 5Проверьте результат на контрольном примере с известным ожидаемым значением
Регулярные выражения для сложных шаблонов
Когда правила очистки сложные — например, «удалить все, кроме букв, цифр и дефиса» или «убрать повторяющиеся знаки препинания», — удобно использовать регулярные выражения через COM-объект VBScript.RegExp. Способ доступен только на сервере или толстом клиенте под Windows, где зарегистрирован этот COM-компонент.
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "[^0-9A-Za-zА-Яа-яЁё]";
ЧистаяСтрока = RegExp.Replace(Строка, "");
Шаблон [^...] означает «любой символ, кроме перечисленных», поэтому одна операция заменяет весь посимвольный цикл. Для схлопывания пробелов шаблон выглядит как "\s+" с заменой на один пробел — это покрывает и табуляции, и неразрывные пробелы, и переводы строк.
Ограничения подхода существенные: на Linux-сервере COM-объект недоступен, на тонком и веб-клиенте — тоже. Если конфигурация должна работать кроссплатформенно, регулярные выражения реализуют через посимвольный разбор или выносят очистку в отдельную серверную функцию с проверкой доступности COM-объекта.
Сравнение способов очистки
Только обычные пробелы по краям. Быстро, но не берет неразрывный пробел
Любой известный символ. Универсально, но нужно знать, что удалять
Полный контроль по кодам символов. Работает везде, больше кода
Сложные шаблоны в одну строку. Только Windows, сервер или толстый клиент
Очистка данных при загрузке и в формах
На практике очистку чаще всего встраивают в обработчики загрузки данных: при чтении файла Excel каждое строковое значение пропускают через функцию нормализации до записи в базу. Это дешевле, чем потом чистить справочники с сотнями тысяч элементов.
Для полей ввода в управляемых формах очистку выполняют в обработчике ПриИзменении или перед записью объекта. Типичный пример — поле с телефоном или ИНН: пользователь вставляет номер со скобками и дефисами, а в базу сохраняется очищенный вариант.
Отдельный случай — сравнение строк при поиске дублей. Перед сравнением обе строки приводят к одному регистру (ВРег() или НРег()), убирают лишние символы и схлопывают пробелы. Только после этого сравнение дает осмысленный результат: «ООО «Ромашка»» и «ооо ромашка» с лишним пробелом распознаются как одна строка.
Проверка результата и типичные ошибки
Проверить, что строка действительно очищена, помогает вывод кодов символов. Если после очистки сравнение строк не срабатывает, посмотрите коды первого и последнего символов — невидимые знаки выдадут себя неожиданными значениями.
Сообщить("Длина: " + СтрДлина(Строка));
Сообщить("Первый символ: " + КодСимвола(Строка, 1));
Сообщить("Последний: " + КодСимвола(Строка, СтрДлина(Строка)));
Обычный пробел имеет код 32, неразрывный — 160, табуляция — 9, перевод строки — 10, возврат каретки — 13. Любой другой код по краям строки после СокрЛП указывает на символ, который нужно удалить явно.
Что важно запомнить
СокрЛП убирает только обычные пробелы по краям. Неразрывный пробел, табуляцию и переводы строк удаляют через СтрЗаменить с Символы или Символ(код). Повторные пробелы схлопывают в цикле. Сложные шаблоны решают посимвольным разбором по кодам или RegExp на Windows. Перед массовой очисткой данных делайте резервную копию.
Частые вопросы
Почему СокрЛП не убирает пробел в конце строки?
Скорее всего, это неразрывный пробел с кодом 160 — он визуально выглядит как обычный, но СокрЛП его игнорирует. Проверьте код последнего символа через КодСимвола() и удалите его заменой: СтрЗаменить(Строка, Символы.НПП, "").
Как удалить из строки все символы, кроме цифр?
Пройдите по строке посимвольно и соберите результат только из символов с кодами 48–57. На Windows-сервере можно короче: RegExp с шаблоном "[^0-9]" и заменой на пустую строку.
Как убрать переносы строк, чтобы текст стал одной строкой?
Замените сначала возврат каретки на пустоту, затем перевод строки на пробел: СтрЗаменить(СтрЗаменить(Строка, Символы.ВК, ""), Символы.ПС, " "). После этого примените СокрЛП и при необходимости схлопните двойные пробелы.
Можно ли очистить строку запросом, без кода?
В языке запросов 1С есть только функция СокрЛП для полей. Полноценная замена символов в запросе недоступна, поэтому сложную очистку выполняют после выгрузки результата запроса в таблицу значений.
Как убрать лишние символы сразу у многих элементов справочника?
Напишите обработку: запросом выберите элементы, в цикле очистите нужное поле функцией нормализации и запишите объект. Обязательно выполняйте обработку на копии базы и выводите журнал изменений — старое и новое значение каждой строки.
Чем отличается Символ(160) от Символы.НПП?
Ничем по результату — оба возвращают неразрывный пробел. Символы.НПП читается понятнее в коде, а Символ(160) полезен, когда нужно работать с произвольными кодами символов, для которых нет предопределенной константы.