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