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

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

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

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

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

Базовый приём выглядит так: берётся левая часть строки длиной на единицу меньше её полной длины. Для строки «Товар;» выражение Лев(Строка, СтрДлина(Строка) - 1) вернёт «Товар». Этот подход работает и в тонком клиенте, и на сервере, и в веб-клиенте — функции строковой обработки полностью кроссплатформенны.

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

Основной способ: функции Лев() и СтрДлина()

Функция СтрДлина(Строка) возвращает количество символов в строке, а Лев(Строка, ЧислоСимволов) — указанное количество символов с начала строки. Вычитая единицу из длины, получаем строку без последнего символа.

Строка = "Артикул-001;";

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

// Результат: "Артикул-001"

Этот код безопасно выполняется в любом контексте — в модуле формы, в общем модуле, на сервере. Функции строковой обработки не требуют подключения к базе данных и не вызывают обращений к СУБД, поэтому работают быстро даже в циклах на сотни тысяч итераций.

Если операция встречается в коде часто, её выносят в отдельную функцию общего модуля. Это упрощает поддержку: исправление логики делается в одном месте, а не по всей конфигурации.

Защита от пустой строки и ошибок выполнения

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

Надёжный вариант функции с проверкой:

Функция УбратьПоследнийСимвол(Строка) Экспорт

Если Не ЗначениеЗаполнено(Строка) Тогда

Возврат Строка;

КонецЕсли;

Возврат Лев(Строка, СтрДлина(Строка) - 1);

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

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

Убрать последний символ, только если это конкретный символ

Частая ситуация — удалить завершающую запятую, точку с запятой или перенос строки, но только если он реально присутствует. Слепая обрезка удалит и значащий символ, если разделителя в конце не было.

Если Прав(Строка, 1) = ";" Тогда

Строка = Лев(Строка, СтрДлина(Строка) - 1);

КонецЕсли;

Функция Прав(Строка, 1) возвращает последний символ, что позволяет проверить условие перед обрезкой. Такой подход стандартен при сборке строк через цикл, когда после каждого элемента добавляется разделитель.

Порядок действий при сборке строки с разделителем
  1. 1
    Сформируйте строку в цикле, добавляя разделитель после каждого элемента
  2. 2
    После цикла проверьте последний символ функцией Прав(Строка, 1)
  3. 3
    Если это разделитель — обрежьте его через Лев(Строка, СтрДлина(Строка) - 1)
  4. 4
    Проверьте результат на пустую строку до передачи дальше

Альтернатива без обрезки — собирать элементы в массив и соединять их функцией СтрСоединить(Массив, "; "). Этот способ чище: разделитель вставляется только между элементами, и удалять последний символ вообще не требуется.

Обрезка нескольких символов и служебных символов

Если нужно убрать не один, а несколько последних символов (например, расширение файла «.csv» вместе с точкой), измените вычитаемое число: Лев(Строка, СтрДлина(Строка) - 4). Перед этим убедитесь, что длина строки больше отрезаемого количества символов.

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

// Убрать завершающие пробелы и переносы строк

Строка = СокрП(Строка);

// Теперь обрезка последнего видимого символа

Если СтрДлина(Строка) > 0 Тогда

Строка = Лев(Строка, СтрДлина(Строка) - 1);

КонецЕсли;

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

Альтернативные способы: Сред() и СтрСоединить()

Функция Сред(Строка, 1, СтрДлина(Строка) - 1) даёт тот же результат, что и Лев(), но читается хуже — по соглашениям разработки для взятия начала строки принято использовать именно Лев(). Разницы в производительности между ними нет.

Для задачи «убрать последний элемент списка» правильнее не обрезать строку, а перестроить логику: хранить элементы в массиве, удалять последний элемент методом Массив.Удалить(Массив.ВГраница()) и соединять через СтрСоединить(). Строковая обрезка остаётся уместной для разовых операций и разбора внешних данных.

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

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

Универсальный способ для одиночной обрезки; требует проверки длины строки

Прав + условие + Лев

Когда нужно удалить только конкретный завершающий символ, например разделитель

Массив + СтрСоединить

Когда строка собирается в цикле; обрезка вообще не нужна, код надёжнее

СокрП + Лев

Когда в конце могут быть служебные символы из файлов и внешних систем

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

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

Для строк из файлов полезно вывести код последнего символа: КодСимвола(Прав(Строка, 1)). Код 10 — это перенос строки, 13 — возврат каретки, 32 — пробел, 160 — неразрывный пробел. Так быстро видно, какой именно символ будет удалён.

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

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

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

На 1 меньше длины исходной строки

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

Длина не изменилась или уменьшилась больше чем на 1

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

Ожидаемый значащий символ данных

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

Пропал значащий символ или остался разделитель

Пустая исходная строка
Норма

Функция вернула пустую строку без ошибки

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

Ошибка выполнения или неожиданное значение

Где это применяется на практике

Типичный сценарий — формирование строки для запроса или представления списка: в цикле к строке добавляется «Элемент, », и после цикла последние два символа (запятая и пробел) обрезаются. Второй сценарий — очистка наименований от завершающих точек при загрузке прайсов. Третий — удаление слэша в конце пути к каталогу перед склейкой с именем файла.

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

Итог

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

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

Часто задаваемые вопросы

Что будет, если применить Лев(Строка, СтрДлина(Строка) - 1) к пустой строке?

Второй аргумент станет равен -1, и функция вернёт пустую строку без ошибки выполнения. Опасность не в падении кода, а в том, что дальнейшая логика получит пустое значение там, где ожидались данные. Поэтому перед обрезкой стоит проверять СтрДлина(Строка) > 0.

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

Измените вычитаемое значение: Лев(Строка, СтрДлина(Строка) - 2). Перед этим убедитесь, что длина строки больше двух символов, иначе результат будет пустым или неожиданным.

Можно ли удалить последний символ функцией СтрЗаменить?

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

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

Проверьте последний символ через КодСимвола(Прав(Строка, 1)): код 10 соответствует переносу строки. Можно также применить СокрП(Строка) — она удалит завершающие пробелы и переносы, но затронет и все пробельные символы, если их несколько.

Работает ли этот приём в запросах 1С?

В языке запросов есть функция ПОДСТРОКА(Строка, Начало, Длина), поэтому обрезку можно выполнить как ПОДСТРОКА(Поле, 1, ВыражениеДлины - 1), однако вычисление длины в запросе громоздко. Обычно проще обрезать строку уже после выборки, в коде на встроенном языке.

Есть ли разница между Лев() и Сред() для этой задачи?

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