Разработка и Конфигурация · 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. Для удаления конкретного набора символов (скобки, дефисы, точки) можно последовательно вызвать СтрЗаменить для каждого символа — это короче цикла, если символов немного.
Для удаления лишних пробелов по краям используйте СокрЛП(), СокрЛ(), СокрП(). Двойные пробелы внутри строки убирают циклом замены « » на « » до тех пор, пока Найти() перестанет возвращать ненулевую позицию.
// Удалить двойные пробелы
Пока Найти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;Удаление непечатаемых символов: переносы, табуляции, неразрывные пробелы
Данные из Excel, веб-форм и обменов часто содержат невидимые символы: переносы строк, табуляции, неразрывные пробелы (код 160). Они ломают сравнение строк и поиск, хотя визуально строки выглядят одинаково. Удаляют их через объект Символы:
Строка = СтрЗаменить(Строка, Символы.ПС, " ");
Строка = СтрЗаменить(Строка, Символы.ВК, "");
Строка = СтрЗаменить(Строка, Символы.Таб, " ");
Строка = СтрЗаменить(Строка, Символ(160), " "); // неразрывный пробел
Обратите внимание: перенос строки в тексте обычно состоит из пары ВК+ПС, поэтому удалять их лучше в указанном порядке — сначала ПС заменить, потом ВК. Неразрывный пробел (Символ(160)) — частая причина «фантомных» несовпадений при сравнении наименований из разных источников.
Выбор способа под разные условия
Единого «правильного» метода нет — решение определяется тем, что известно о подстроке. Ориентируйтесь на таблицу ниже.
| Что известно | Способ | Ограничение |
|---|---|---|
| Точный текст подстроки | СтрЗаменить с "" | Удаляет все вхождения, чувствительна к регистру |
| Позиция или маркер | Найти + Лев/Сред/Прав | Нужна проверка, что маркер найден |
| Класс символов (цифры, буквы) | Цикл с Найти по алфавиту | Медленнее на очень длинных строках |
| Пробелы по краям | СокрЛП | Не трогает пробелы внутри строки |
| Невидимые символы | СтрЗаменить с Символы.ПС, Символ(160) | Нужно знать коды символов |
Как выбрать действие
Проверка результата и типичные ошибки
После обработки полезно проверить результат программно, особенно в массовых операциях. Минимальные проверки: строка не стала пустой, её длина уменьшилась на ожидаемую величину, искомая подстрока больше не находится:
Если Найти(Результат, УдаляемаяПодстрока) > 0 Тогда
// подстрока осталась — логика отработала не полностью
КонецЕсли;
Отдельная ловушка — вложенные вхождения. Если удалять «аб» из строки «аабб», после первого прохода останется «аб» — вхождение образовалось заново. В таких случаях замену выполняют в цикле до тех пор, пока Найти() возвращает ненулевую позицию.
Что важно запомнить
Основной инструмент удаления подстроки — СтрЗаменить с пустой строкой замены; результат обязательно присваивается переменной. Для удаления по позиции используют Найти() вместе с Лев(), Сред(), Прав() и всегда проверяют, что маркер найден. Перед массовой обработкой данных очистку тестируют на копии базы и проверяют результат программно.
Частые вопросы
Как удалить подстроку без учёта регистра?
Штатной функции замены без учёта регистра во встроенном языке нет. Приведите копию строки к одному регистру через НРег(), найдите позицию подстроки в ней, а затем удалите фрагмент из исходной строки по найденной позиции через Лев() и Сред(). Либо переберите варианты регистра, если их немного.
Как удалить последние N символов строки?
Используйте Лев(Строка, СтрДлина(Строка) - N). Предварительно проверьте, что длина строки больше N, иначе получите ошибку или пустую строку там, где это не ожидается.
Можно ли удалить подстроку в запросе 1С?
В языке запросов есть функция ПОДСТРОКА(), но полноценной замены нет. На практике строки обрабатывают после выборки в цикле по результату запроса, либо используют ВЫРАЗИТЬ и ПОДСТРОКА для обрезки до фиксированной длины. Для сложной очистки запрос не подходит — обрабатывайте данные в коде.
Как удалить все пробелы из строки, включая внутренние?
Один вызов: Строка = СтрЗаменить(Строка, " ", ""). Учтите, что это удалит и неодиночные пробелы, и обычные, но не затронет неразрывный пробел (код 160) — его удаляют отдельно через Символ(160).
Почему СтрЗаменить не меняет мою строку?
Почти всегда причина в том, что результат не присвоен обратно. Функция возвращает новую строку, а исходную переменную не изменяет. Правильно: Строка = СтрЗаменить(Строка, "x", ""). Также проверьте регистр символов и точное совпадение подстроки.
Как удалить всё после определённого слова?
Найдите позицию слова через Найти(), прибавьте к ней длину слова и возьмите Лев() до этой позиции минус один. Если слово может отсутствовать, обязательно обработайте случай Найти() = 0, оставив строку без изменений.