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

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

Как очистить строку в 1С: все рабочие способы

Как очистить строку в 1С от пробелов, лишних символов и непечатаемых знаков. СокрЛП, СтрЗаменить, регулярные выражения и готовые примеры кода.

При обработке данных в 1С строки часто содержат лишние пробелы, неразрывные пробелы, переносы и непечатаемые символы — особенно если данные загружены из Excel, сайтов или обменов. Если не очистить строку перед сравнением или записью, поиск в справочнике не найдёт элемент, а в отчёте появятся «дубли» с визуально одинаковыми значениями.

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

Удаление пробелов по краям строки: СокрЛ, СокрЛП, СокрП

Самая частая задача — убрать пробелы в начале и конце строки. Для этого в 1С есть три функции: СокрЛ удаляет пробелы слева, СокрП — справа, СокрЛП — с обеих сторон. В подавляющем большинстве случаев используют именно СокрЛП.

Наименование = СокрЛП(НаименованиеИзФайла);

// " Товар А " превратится в "Товар А"

Важное ограничение: эти функции удаляют только обычные пробелы (код 32) и некоторые управляющие символы по краям. Неразрывный пробел (код 160), который часто попадает в данные при копировании из веб-страниц и Excel, функция СокрЛП не трогает. Визуально строка выглядит чистой, но сравнение с эталоном даёт «ложь».

Также СокрЛП не удаляет пробелы внутри строки. Если нужно убрать двойные пробелы между словами или все пробелы вообще, потребуется СтрЗаменить или цикл.

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

Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки. Если в качестве замены указать пустую строку, символы будут удалены. Это универсальный способ очистки от известного «мусора».

// Убрать все обычные пробелы

ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, " ", "");

// Убрать неразрывный пробел

ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символ(160), "");

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

ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.ПС, " ");

ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.Таб, "");

Обратите внимание на порядок операций: сначала удаляют специальные символы, затем применяют СокрЛП — иначе после удаления переносов по краям могут остаться обычные пробелы. Типовая цепочка для загруженных извне данных выглядит так: замена неразрывных пробелов → замена переносов → СокрЛП.

Порядок очистки строки из внешнего источника
  1. 1
    Замените неразрывный пробел: СтрЗаменить(Строка, Символ(160), " ")
  2. 2
    Замените переносы строк и табуляцию на пробел или пустую строку
  3. 3
    Примените СокрЛП к результату
  4. 4
    Проверьте длину строки через СтрДлина и сравнение с эталоном

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

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

Функция ОставитьТолькоЦифры(Строка)

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

bsl
СтрТолькоЦифры = "";
Для Поз = 1 По СтрДлина(НомерТелефона) Цикл
    Симв = Сред(НомерТелефона, Поз, 1);
    Если СтрНайти("0123456789", Симв) > 0 Тогда
        СтрТолькоЦифры = СтрТолькоЦифры + Симв;
    КонецЕсли;
КонецЦикла;

Очистка строки регулярными выражениями

В свежих версиях платформы 1С:Предприятие 8.3 доступны объекты РегулярноеВыражение и методы для поиска и замены по шаблону. Это самый компактный способ сложной очистки: удалить все нецифровые символы, схлопнуть повторные пробелы, убрать HTML-теги.

// Удалить всё, кроме цифр

РегВыр = Новый РегулярноеВыражение("[^0-9]");

ЧистаяСтрока = РегВыр.Заменить(ИсходнаяСтрока, "");

// Схлопнуть повторные пробелы в один

РегВыр2 = Новый РегулярноеВыражение("\s+");

ЧистаяСтрока = РегВыр2.Заменить(ЧистаяСтрока, " ");

Если ваша версия платформы не поддерживает объект РегулярноеВыражение, альтернативы — цикл по символам (см. предыдущий раздел) или подключение внешних компонент. Проверить доступность объекта можно через синтакс-помощник конфигуратора по вашей версии платформы.

Сравнение способов очистки

СокрЛП

Только пробелы по краям. Быстро, но не удаляет неразрывный пробел и мусор внутри строки.

СтрЗаменить

Удаление известных символов и подстрок. Требует перечислить все варианты мусора.

Цикл по символам

Гибкая фильтрация по списку допустимых знаков. Медленнее на длинных строках.

Регулярные выражения

Сложные шаблоны одной строкой кода. Требуют современной версии платформы.

Очистка строки в запросе

Иногда очистить строку нужно прямо в запросе — например, чтобы корректно сработало соединение таблиц по наименованию. В языке запросов 1С доступна функция СОКРЛП, а вот аналога СтрЗаменить в запросах нет.

ВЫБРАТЬ

СОКРЛП(Номенклатура.Наименование) КАК Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

Если нужно убрать из строки конкретные символы в запросе, приходится использовать вложенные конструкции ПОДСТРОКА и ВЫБОР КОГДА, что быстро становится громоздким. Практичнее выгрузить результат и обработать его в коде, либо хранить в базе уже очищенное значение — например, в дополнительном реквизите, заполняемом при записи объекта.

Проверка результата и типичные ошибки

После очистки строку стоит проверить, особенно если результат участвует в поиске или сравнении. Простейшие контрольные точки: длина строки до и после обработки, сравнение с эталонным значением, вывод кодов символов для подозрительных позиций.

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

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

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

СтрДлина соответствует видимому числу символов

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

Длина больше видимого текста — есть скрытые символы

Сравнение с эталоном
Норма

ОчищеннаяСтрока = Эталон даёт Истина

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

Сравнение ложно при визуально одинаковых строках

Коды крайних символов
Норма

КодСимвола возвращает коды обычных букв/цифр

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

Коды 160, 9, 10, 13 по краям строки

Распространённая ошибка — очистка строки в одном месте, но не в другом: например, при поиске контрагента по ИНН строка из файла очищена, а значение в базе содержит пробел. Сравнение всё равно не сработает. Правило: очищать нужно обе сравниваемые строки либо гарантировать чистоту данных на этапе записи в базу.

Типичные ошибки
01
Ожидание, что СокрЛП удалит неразрывный пробел — он остаётся, и сравнение строк ломается
02
Очистка только одной из сравниваемых строк — поиск по справочнику не находит элемент
03
Удаление всех пробелов из наименования — слова склеиваются, данные портятся
04
Использование СтрЗаменить с пустой строкой поиска — функция не выполняет осмысленной замены

FAQ

Как удалить все пробелы из строки в 1С, включая внутренние?

Используйте СтрЗаменить(Строка, " ", "") — функция удалит все вхождения обычного пробела. Дополнительно замените неразрывный пробел: СтрЗаменить(Результат, Символ(160), "").

Почему СокрЛП не очищает строку от пробела?

Скорее всего, в строке неразрывный пробел (код 160) или табуляция, которые СокрЛП не обрабатывает. Проверьте код символа функцией КодСимвола и удалите его через СтрЗаменить.

Как убрать переносы строк из многострочного текста?

Замените символы переноса на пробел или пустую строку: СтрЗаменить(Текст, Символы.ПС, " ") и при необходимости СтрЗаменить(Текст, Символы.ВК, ""). После этого примените СокрЛП.

Можно ли очистить строку без программирования?

В пользовательском режиме встроенной очистки нет. Если мусорные символы попали в данные справочников, понадобится либо обработка, написанная разработчиком, либо ручное исправление конкретных элементов.

Как очистить строку от HTML-тегов после загрузки с сайта?

Удобнее всего регулярное выражение с шаблоном "<[^>]*>", заменяемое на пустую строку. Если регулярные выражения недоступны, используйте цикл, отсекающий всё между символами < и >.

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

Используйте функцию ПустаяСтрока(СокрЛП(Строка)) — она вернёт Истина, если после удаления пробелов в строке ничего не осталось. Для строк с неразрывными пробелами предварительно удалите Символ(160).

Итог

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

СокрЛП убирает только обычные пробелы по краям, СтрЗаменить удаляет конкретные символы, цикл или регулярное выражение — произвольный мусор. Неразрывный пробел (Символ(160)) требует отдельной обработки. Очищать нужно обе сравниваемые строки, а результат проверять через СтрДлина и КодСимвола.