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