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

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

Как обрезать строку справа в 1С

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

Обрезка строки справа — одна из самых частых операций при работе со строками во встроенном языке 1С. Типичные задачи: убрать пробелы в конце наименования, отрезать последние N символов (например, разделитель или расширение файла), удалить завершающий символ переноса строки. Для каждой из этих ситуаций в платформе есть свой инструмент, и выбор неправильного приводит к потере данных или лишним пробелам в отчётах и печатных формах.

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

Удаление пробелов справа функцией СокрП

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

Наименование = " Товар с пробелами  ";

Результат = СокрП(Наименование);

// Результат: " Товар с пробелами" — пробелы справа удалены, слева остались

Если пробелы нужно убрать с обеих сторон, используется СокрЛП(), а для левого края — СокрЛ(). Эти функции не изменяют исходную переменную, а возвращают новую строку: результат нужно присвоить переменной или сразу использовать в выражении.

Обрезка последних N символов через Лев и СтрДлина

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

СтрокаСписка = "Молоко, Хлеб, Сахар, ";

// Убираем последние 2 символа: запятую и пробел

Длина = СтрДлина(СтрокаСписка);

Если Длина > 2 Тогда

Результат = Лев(СтрокаСписка, Длина - 2);

КонецЕсли;

// Результат: "Молоко, Хлеб, Сахар"

Ключевой момент — проверка длины перед обрезкой. Если строка короче, чем количество отрезаемых символов, выражение Длина - N станет отрицательным или нулевым, и Лев() вернёт пустую строку. В прикладном коде это часто приводит к трудно отлавливаемым ошибкам: например, пустому наименованию в печатной форме.

bsl
// Универсальная функция обрезки строки справа
Функция ОбрезатьСправа(Строка, КоличествоСимволов)
  Если СтрДлина(Строка) <= КоличествоСимволов Тогда
    Возврат "";
  КонецЕсли;
  Возврат Лев(Строка, СтрДлина(Строка) - КоличествоСимволов);
КонецФункции

Практические сценарии обрезки справа

Удаление завершающего разделителя после цикла

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

Для Каждого Элемент Из СписокТоваров Цикл

Результат = Результат + Элемент + "; ";

КонецЦикла;

// Убираем последние "; "

Результат = Лев(Результат, СтрДлина(Результат) - 2);

Удаление расширения файла

Если известна длина расширения, его отрезают тем же способом. Надёжнее — найти позицию последней точки через СтрНайти() с направлением поиска с конца и взять левую часть до неё: так код не сломается на расширениях разной длины (.xls.xlsx).

ИмяФайла = "Отчет.xlsx";

ПозицияТочки = СтрНайти(ИмяФайла, ".", НаправлениеПоиска.СКонца);

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

ИмяБезРасширения = Лев(ИмяФайла, ПозицияТочки - 1);

КонецЕсли;

// Результат: "Отчет"

Удаление конкретного суффикса, а не просто символов

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

Порядок действий при обрезке справа
  1. 1
    Определите, что именно нужно убрать: пробелы (СокрП), фиксированное число символов (Лев + СтрДлина) или конкретный суффикс (СтрЗаканчиваетсяНа + Лев)
  2. 2
    Проверьте длину строки перед обрезкой — она должна быть больше отрезаемого фрагмента
  3. 3
    Выполните обрезку и присвойте результат переменной — исходная строка не меняется сама
  4. 4
    Проверьте результат на граничных случаях: пустая строка, строка короче N, строка без суффикса

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

Сравнение вариантов

СокрП()

Только пробелы и служебные символы справа. Безопасна на любых строках, но не умеет отрезать значащие символы.

Лев() + СтрДлина()

Универсальный способ отрезать N символов справа. Требует проверки длины, иначе вернёт пустую строку.

СтрЗаканчиваетсяНа() + Лев()

Удаление конкретного суффикса. Самый надёжный вариант, когда суффикс может отсутствовать.

СтрНайти() с конца + Лев()

Обрезка до последнего вхождения символа, например расширения файла. Гибко, но требует проверки, что символ найден.

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Вызов СокрП(Строка) без присваивания результата — строка остаётся с пробелами
02
Обрезка через Лев(Строка, СтрДлина(Строка) - N) без проверки длины — пустой результат на коротких строках
03
Отрезание суффикса по длине без проверки СтрЗаканчиваетсяНа — портятся строки без суффикса
04
Попытка убрать неразрывный пробел функцией СокрП — символ 160 не всегда удаляется, нужна замена

Проверка результата обрезки

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

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

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

Длина результата
Норма

Уменьшилась ровно на ожидаемое число символов

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

Строка стала пустой или длина не изменилась

Последний символ результата
Норма

Это значащий символ, а не пробел или разделитель

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

В конце остался разделитель или невидимый символ

Граничные случаи
Норма

Пустая и короткая строки обработаны без ошибок

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

На короткой строке результат потерян

Для отладки удобно выводить строку в сообщение с видимыми маркерами границ, например: Сообщить("[" + Результат + "]"). Квадратные скобки сразу покажут хвостовые пробелы, которые невидимы при обычном выводе.

FAQ

Чем СокрП отличается от СокрЛП?

СокрП удаляет незначащие символы только справа (в конце строки), а СокрЛП — с обеих сторон. Если строка имеет пробелы слева и их нужно сохранить, используйте СокрП; для полной очистки краёв — СокрЛП.

Как удалить последний символ строки, не зная, что это за символ?

Используйте Лев(Строка, СтрДлина(Строка) - 1), предварительно проверив, что строка не пустая. Эта конструкция отрезает ровно один последний символ независимо от его содержимого.

Почему СокрП не убирает пробел в конце строки из Excel?

Скорее всего, это неразрывный пробел (символ с кодом 160), а не обычный. Сначала выполните СтрЗаменить(Строка, Символ(160), " "), затем примените СокрП.

Изменяет ли Лев исходную строку?

Нет. Лев, СокрП и другие строковые функции возвращают новую строку, исходная переменная остаётся неизменной. Результат нужно явно присвоить: Строка = Лев(Строка, СтрДлина(Строка) - 2).

Как убрать справа определённое слово, а не символы?

Проверьте наличие суффикса через СтрЗаканчиваетсяНа(Строка, "суффикс"), затем отрежьте его длину: Лев(Строка, СтрДлина(Строка) - СтрДлина("суффикс")). Без проверки вы отрежете символы и у строк, где суффикса не было.

Есть ли в 1С функция Прав, и можно ли ей обрезать справа?

Функция Прав(Строка, N) возвращает N символов с конца строки — это противоположная задача. Для обрезки справа она не подходит: используйте Лев с вычитанием длины обрезаемой части из общей длины строки.

Итог

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

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