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

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

Как удалить подстроку из строки в 1С

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

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

Выбор способа зависит от того, что известно о подстроке: её точное содержимое, позиция в строке или только шаблон (например, «все цифры» или «всё после запятой»). Ниже разобраны основные приёмы с готовым кодом, условиями применения и типичными ошибками.

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

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

ИсходнаяСтрока = "Заказ №АБ-000123 от клиента";

Результат = СтрЗаменить(ИсходнаяСтрока, "АБ-", "");

// Результат: "Заказ №000123 от клиента"

Важно понимать, что заменяются все вхождения подстроки, а не только первое. Если в строке «Иванов Иван Иванович» удалить «Иван», исчезнут все три вхождения. Когда нужно удалить только одно вхождение, СтрЗаменить не подходит — используйте поиск позиции (см. ниже).

Функция чувствительна к регистру: подстроки «аб» и «АБ» — разные значения. Если регистр исходных данных непредсказуем, предварительно приведите обе строки к одному регистру через ВРег() или НРег(), либо учтите это в логике обработки.

Удаление подстроки по позиции: Найти, Лев, Прав, Сред

Когда известна позиция подстроки или её можно найти по маркеру, строку собирают из частей. Базовые функции: Найти(Строка, Подстрока) возвращает позицию первого вхождения (или 0, если не найдено), Лев(), Прав() и Сред() извлекают фрагменты.

Пример — удалить всё от символа «/» и до конца строки:

Строка = "Товар/черновик";

Позиция = Найти(Строка, "/");

Если Позиция > 0 Тогда

Результат = Лев(Строка, Позиция - 1);

Иначе

Результат = Строка;

КонецЕсли;

// Результат: "Товар"

Чтобы удалить фрагмент из середины (например, символы с 3 по 5), объединяют левую и правую части:

Строка = "АБВ123456";

Результат = Лев(Строка, 3) + Сред(Строка, 7);

// Результат: "АБВ456" — удалены символы с 4 по 6

Проверка Если Позиция > 0 обязательна: если маркер не найден, Лев(Строка, -1) вызовет ошибку выполнения. Это одна из самых распространённых причин падения обработок на «неожиданных» данных.

Удаление первого или последнего вхождения

СтрЗаменить удаляет все вхождения, но иногда нужно убрать только первое (например, префикс в начале) или только последнее. Для первого вхождения комбинируют Найти и Сред:

Строка = "01-02-03";

Позиция = Найти(Строка, "-");

Если Позиция > 0 Тогда

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

КонецЕсли;

// Результат: "0102-03" — удалён только первый дефис

Для удаления префикса только в начале строки удобно проверить, что позиция равна 1, либо использовать СтрНачинаетсяС() (доступна в современных версиях платформы):

Если СтрНачинаетсяС(Наименование, "г. ") Тогда

Наименование = Сред(Наименование, 4);

КонецЕсли;

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

Удаление символов по шаблону: цифры, буквы, спецсимволы

Когда нужно удалить не конкретную подстроку, а целый класс символов (все цифры, все нецифровые знаки, лишние пробелы), строку собирают заново в цикле:

Функция УдалитьЦифры(Строка)

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Обратный вариант — оставить только цифры (типичная задача при очистке телефонов и ИНН): тогда условие меняется на Если Найти(Допустимые, Символ) > 0. Для удаления конкретного набора символов (скобки, дефисы, точки) можно последовательно вызвать СтрЗаменить для каждого символа — это короче цикла, если символов немного.

Для удаления лишних пробелов по краям используйте СокрЛП(), СокрЛ(), СокрП(). Двойные пробелы внутри строки убирают циклом замены « » на « » до тех пор, пока Найти() перестанет возвращать ненулевую позицию.

bsl
// Удалить двойные пробелы
Пока Найти(Строка, "  ") > 0 Цикл
    Строка = СтрЗаменить(Строка, "  ", " ");
КонецЦикла;

Удаление непечатаемых символов: переносы, табуляции, неразрывные пробелы

Данные из Excel, веб-форм и обменов часто содержат невидимые символы: переносы строк, табуляции, неразрывные пробелы (код 160). Они ломают сравнение строк и поиск, хотя визуально строки выглядят одинаково. Удаляют их через объект Символы:

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

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

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

Строка = СтрЗаменить(Строка, Символ(160), " "); // неразрывный пробел

Обратите внимание: перенос строки в тексте обычно состоит из пары ВК+ПС, поэтому удалять их лучше в указанном порядке — сначала ПС заменить, потом ВК. Неразрывный пробел (Символ(160)) — частая причина «фантомных» несовпадений при сравнении наименований из разных источников.

Выбор способа под разные условия

Единого «правильного» метода нет — решение определяется тем, что известно о подстроке. Ориентируйтесь на таблицу ниже.

Что известноСпособОграничение
Точный текст подстрокиСтрЗаменить с ""Удаляет все вхождения, чувствительна к регистру
Позиция или маркерНайти + Лев/Сред/ПравНужна проверка, что маркер найден
Класс символов (цифры, буквы)Цикл с Найти по алфавитуМедленнее на очень длинных строках
Пробелы по краямСокрЛПНе трогает пробелы внутри строки
Невидимые символыСтрЗаменить с Символы.ПС, Символ(160)Нужно знать коды символов
Маршрут решения

Как выбрать действие

Известен точный текст подстроки и нужно удалить все вхожденияИспользуйте СтрЗаменить(Строка, Подстрока, "")
Нужно удалить только одно вхождение или фрагмент по позицииНайдите позицию через Найти() и соберите строку из Лев() и Сред()
Удаляется класс символов (все цифры, все буквы)Переберите строку в цикле и соберите результат из допустимых символов
Строки «одинаковые», но сравнение не проходитПроверьте неразрывные пробелы (Символ(160)) и переносы строк, удалите их через СтрЗаменить

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

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

Если Найти(Результат, УдаляемаяПодстрока) > 0 Тогда

// подстрока осталась — логика отработала не полностью

КонецЕсли;

Типичные ошибки
01
Вызов СтрЗаменить без присвоения результата — переменная не меняется, код «не работает»
02
Отсутствие проверки Найти() > 0 перед Лев()/Сред() — ошибка выполнения на строках без маркера
03
Ожидание, что СтрЗаменить удалит только первое вхождение — удаляются все, данные искажаются
04
Игнорирование регистра — подстрока «Аб» не совпадает с «АБ», замена не срабатывает
05
Сравнение строк без очистки неразрывных пробелов — «одинаковые» строки считаются разными

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

Итог

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

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

Частые вопросы

Как удалить подстроку без учёта регистра?

Штатной функции замены без учёта регистра во встроенном языке нет. Приведите копию строки к одному регистру через НРег(), найдите позицию подстроки в ней, а затем удалите фрагмент из исходной строки по найденной позиции через Лев() и Сред(). Либо переберите варианты регистра, если их немного.

Как удалить последние N символов строки?

Используйте Лев(Строка, СтрДлина(Строка) - N). Предварительно проверьте, что длина строки больше N, иначе получите ошибку или пустую строку там, где это не ожидается.

Можно ли удалить подстроку в запросе 1С?

В языке запросов есть функция ПОДСТРОКА(), но полноценной замены нет. На практике строки обрабатывают после выборки в цикле по результату запроса, либо используют ВЫРАЗИТЬ и ПОДСТРОКА для обрезки до фиксированной длины. Для сложной очистки запрос не подходит — обрабатывайте данные в коде.

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

Один вызов: Строка = СтрЗаменить(Строка, " ", ""). Учтите, что это удалит и неодиночные пробелы, и обычные, но не затронет неразрывный пробел (код 160) — его удаляют отдельно через Символ(160).

Почему СтрЗаменить не меняет мою строку?

Почти всегда причина в том, что результат не присвоен обратно. Функция возвращает новую строку, а исходную переменную не изменяет. Правильно: Строка = СтрЗаменить(Строка, "x", ""). Также проверьте регистр символов и точное совпадение подстроки.

Как удалить всё после определённого слова?

Найдите позицию слова через Найти(), прибавьте к ней длину слова и возьмите Лев() до этой позиции минус один. Если слово может отсутствовать, обязательно обработайте случай Найти() = 0, оставив строку без изменений.