Разработка и Конфигурация · 9 мин
Как очистить строку в 1С: все рабочие способы
Как очистить строку в 1С от пробелов, лишних символов и непечатаемых знаков. СокрЛП, СтрЗаменить, регулярные выражения и готовые примеры кода.
При обработке данных в 1С строки часто содержат лишние пробелы, неразрывные пробелы, переносы и непечатаемые символы — особенно если данные загружены из Excel, сайтов или обменов. Если не очистить строку перед сравнением или записью, поиск в справочнике не найдёт элемент, а в отчёте появятся «дубли» с визуально одинаковыми значениями.
Во встроенном языке 1С нет единой функции «очистить строку полностью» — вместо этого используется комбинация методов: СокрЛП, СтрЗаменить, СтрДлина, функции работы с символами и, в новых версиях платформы, регулярные выражения. Выбор зависит от того, что именно нужно убрать: краевые пробелы, все пробелы внутри, нецифровые символы или мусор после загрузки.
Удаление пробелов по краям строки: СокрЛ, СокрЛП, СокрП
Самая частая задача — убрать пробелы в начале и конце строки. Для этого в 1С есть три функции: СокрЛ удаляет пробелы слева, СокрП — справа, СокрЛП — с обеих сторон. В подавляющем большинстве случаев используют именно СокрЛП.
Наименование = СокрЛП(НаименованиеИзФайла);
// " Товар А " превратится в "Товар А"
Важное ограничение: эти функции удаляют только обычные пробелы (код 32) и некоторые управляющие символы по краям. Неразрывный пробел (код 160), который часто попадает в данные при копировании из веб-страниц и Excel, функция СокрЛП не трогает. Визуально строка выглядит чистой, но сравнение с эталоном даёт «ложь».
Также СокрЛП не удаляет пробелы внутри строки. Если нужно убрать двойные пробелы между словами или все пробелы вообще, потребуется СтрЗаменить или цикл.
Удаление конкретных символов через СтрЗаменить
Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки. Если в качестве замены указать пустую строку, символы будут удалены. Это универсальный способ очистки от известного «мусора».
// Убрать все обычные пробелы
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, " ", "");
// Убрать неразрывный пробел
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символ(160), "");
// Убрать переносы строк и табуляцию
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.ПС, " ");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.Таб, "");
Обратите внимание на порядок операций: сначала удаляют специальные символы, затем применяют СокрЛП — иначе после удаления переносов по краям могут остаться обычные пробелы. Типовая цепочка для загруженных извне данных выглядит так: замена неразрывных пробелов → замена переносов → СокрЛП.
- 1Замените неразрывный пробел: СтрЗаменить(Строка, Символ(160), " ")
- 2Замените переносы строк и табуляцию на пробел или пустую строку
- 3Примените СокрЛП к результату
- 4Проверьте длину строки через СтрДлина и сравнение с эталоном
Как оставить в строке только цифры или только буквы
Типовая задача при обработке телефонов, ИНН, артикулов — удалить из строки всё, кроме допустимых символов. В платформах без поддержки регулярных выражений это делается циклом по символам с проверкой вхождения в строку допустимых знаков.
Функция ОставитьТолькоЦифры(Строка)
Результат = "";
Допустимые = "0123456789";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти(Допустимые, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Тот же подход работает для любого набора допустимых символов: букв русского и латинского алфавита, знаков препинания. Для длинных строк цикл выполняется медленнее, чем регулярное выражение, но для типовых полей (телефон, код, ИНН) разница незаметна.
СтрТолькоЦифры = "";
Для Поз = 1 По СтрДлина(НомерТелефона) Цикл
Симв = Сред(НомерТелефона, Поз, 1);
Если СтрНайти("0123456789", Симв) > 0 Тогда
СтрТолькоЦифры = СтрТолькоЦифры + Симв;
КонецЕсли;
КонецЦикла;Очистка строки регулярными выражениями
В свежих версиях платформы 1С:Предприятие 8.3 доступны объекты РегулярноеВыражение и методы для поиска и замены по шаблону. Это самый компактный способ сложной очистки: удалить все нецифровые символы, схлопнуть повторные пробелы, убрать HTML-теги.
// Удалить всё, кроме цифр
РегВыр = Новый РегулярноеВыражение("[^0-9]");
ЧистаяСтрока = РегВыр.Заменить(ИсходнаяСтрока, "");
// Схлопнуть повторные пробелы в один
РегВыр2 = Новый РегулярноеВыражение("\s+");
ЧистаяСтрока = РегВыр2.Заменить(ЧистаяСтрока, " ");
Если ваша версия платформы не поддерживает объект РегулярноеВыражение, альтернативы — цикл по символам (см. предыдущий раздел) или подключение внешних компонент. Проверить доступность объекта можно через синтакс-помощник конфигуратора по вашей версии платформы.
Сравнение способов очистки
Только пробелы по краям. Быстро, но не удаляет неразрывный пробел и мусор внутри строки.
Удаление известных символов и подстрок. Требует перечислить все варианты мусора.
Гибкая фильтрация по списку допустимых знаков. Медленнее на длинных строках.
Сложные шаблоны одной строкой кода. Требуют современной версии платформы.
Очистка строки в запросе
Иногда очистить строку нужно прямо в запросе — например, чтобы корректно сработало соединение таблиц по наименованию. В языке запросов 1С доступна функция СОКРЛП, а вот аналога СтрЗаменить в запросах нет.
ВЫБРАТЬ
СОКРЛП(Номенклатура.Наименование) КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
Если нужно убрать из строки конкретные символы в запросе, приходится использовать вложенные конструкции ПОДСТРОКА и ВЫБОР КОГДА, что быстро становится громоздким. Практичнее выгрузить результат и обработать его в коде, либо хранить в базе уже очищенное значение — например, в дополнительном реквизите, заполняемом при записи объекта.
Проверка результата и типичные ошибки
После очистки строку стоит проверить, особенно если результат участвует в поиске или сравнении. Простейшие контрольные точки: длина строки до и после обработки, сравнение с эталонным значением, вывод кодов символов для подозрительных позиций.
Как проверить результат очистки
СтрДлина соответствует видимому числу символов
Длина больше видимого текста — есть скрытые символы
ОчищеннаяСтрока = Эталон даёт Истина
Сравнение ложно при визуально одинаковых строках
КодСимвола возвращает коды обычных букв/цифр
Коды 160, 9, 10, 13 по краям строки
Распространённая ошибка — очистка строки в одном месте, но не в другом: например, при поиске контрагента по ИНН строка из файла очищена, а значение в базе содержит пробел. Сравнение всё равно не сработает. Правило: очищать нужно обе сравниваемые строки либо гарантировать чистоту данных на этапе записи в базу.
FAQ
Как удалить все пробелы из строки в 1С, включая внутренние?
Используйте СтрЗаменить(Строка, " ", "") — функция удалит все вхождения обычного пробела. Дополнительно замените неразрывный пробел: СтрЗаменить(Результат, Символ(160), "").
Почему СокрЛП не очищает строку от пробела?
Скорее всего, в строке неразрывный пробел (код 160) или табуляция, которые СокрЛП не обрабатывает. Проверьте код символа функцией КодСимвола и удалите его через СтрЗаменить.
Как убрать переносы строк из многострочного текста?
Замените символы переноса на пробел или пустую строку: СтрЗаменить(Текст, Символы.ПС, " ") и при необходимости СтрЗаменить(Текст, Символы.ВК, ""). После этого примените СокрЛП.
Можно ли очистить строку без программирования?
В пользовательском режиме встроенной очистки нет. Если мусорные символы попали в данные справочников, понадобится либо обработка, написанная разработчиком, либо ручное исправление конкретных элементов.
Как очистить строку от HTML-тегов после загрузки с сайта?
Удобнее всего регулярное выражение с шаблоном "<[^>]*>", заменяемое на пустую строку. Если регулярные выражения недоступны, используйте цикл, отсекающий всё между символами < и >.
Как проверить, что строка после очистки стала пустой?
Используйте функцию ПустаяСтрока(СокрЛП(Строка)) — она вернёт Истина, если после удаления пробелов в строке ничего не осталось. Для строк с неразрывными пробелами предварительно удалите Символ(160).
Что важно запомнить
СокрЛП убирает только обычные пробелы по краям, СтрЗаменить удаляет конкретные символы, цикл или регулярное выражение — произвольный мусор. Неразрывный пробел (Символ(160)) требует отдельной обработки. Очищать нужно обе сравниваемые строки, а результат проверять через СтрДлина и КодСимвола.