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