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