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

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

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

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

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

Базовая идея проста: нужно взять не всю строку, а её часть без последнего символа. Для этого вычисляют длину строки, вычитают единицу и берут левую часть нужной длины. Один и тот же результат можно получить несколькими способами, и у каждого есть свои нюансы с пустыми строками, переносами и производительностью в циклах.

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

Базовый способ: функции Лев и СтрДлина

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

ИсходнаяСтрока = "Текст;";

НоваяСтрока = Лев(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1);

// Результат: "Текст"

Этот приём работает в любом контексте: на клиенте, на сервере, в толстом и тонком клиенте, во внешних обработках. Никаких дополнительных библиотек не требуется — обе функции входят во встроенный язык платформы.

Если нужно заменить исходную строку, результат присваивают той же переменной: Строка = Лев(Строка, СтрДлина(Строка) - 1);.

1c
Строка = Лев(Строка, СтрДлина(Строка) - 1); // удалить последний символ

Защита от пустой строки и коротких значений

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

Стандартный безопасный шаблон выглядит так:

Если Не ПустаяСтрока(Строка) Тогда

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

КонецЕсли;

Если по логике задачи нужно удалять символ только при совпадении с ожидаемым (например, убрать завершающую запятую, но не трогать строки без неё), проверяют последний символ через Прав():

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

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

КонецЕсли;

Альтернативные способы обрезки

Кроме классической пары Лев() + СтрДлина(), в 1С есть и другие варианты, которые иногда читаются лучше или лучше подходят под конкретную задачу.

Функция Сред

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

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

По сути это эквивалент Лев(), выигрыша нет, но встречается в чужом коде. Полезно знать, чтобы не путаться при чтении.

Удаление нескольких последних символов

Тот же приём масштабируется: чтобы убрать N последних символов, вычитают N из длины. Пример — обрезка расширения файла из четырёх символов «.txt»:

ИмяФайла = Лев(ИмяФайла, СтрДлина(ИмяФайла) - 4);

Здесь обязательна проверка, что длина строки больше удаляемого количества символов, иначе результат будет пустым или вызовет ошибку.

СтрЗаменить для конкретного символа

Если нужно убрать не «последний символ вообще», а конкретный символ в конце (например, все запятые-разделители), иногда проще использовать СтрЗаменить() или цикл с проверкой Прав(). Но помните: СтрЗаменить() удалит символ по всей строке, а не только в конце — это частая ловушка.

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

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

Универсальный способ, работает везде. Требует проверки на пустую строку.

Сред(Строка, 1, Длина-1)

Аналог Лев, полезен при чтении чужого кода, преимуществ не даёт.

СтрЗаменить

Подходит только когда нужно убрать конкретный символ по всей строке, а не именно последний.

Цикл с Прав

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

Типовая задача: обрезка разделителя в собранной строке

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

Результат = "";

Для Каждого Элемент Из СписокТоваров Цикл

Результат = Результат + Элемент.Наименование + ", ";

КонецЦикла;

Если СтрДлина(Результат) > 0 Тогда

Результат = Лев(Результат, СтрДлина(Результат) - 2); // убираем ", "

КонецЕсли;

Обратите внимание: разделитель здесь состоит из двух символов (запятая и пробел), поэтому вычитается 2, а не 1. Ошибка в этом месте — классика: вычитают единицу, и в конце строки остаётся висячая запятая.

Альтернатива без постобработки — добавлять разделитель перед элементом, кроме первого, либо собирать значения в массив и склеивать через СтрСоединить(). Эти подходы исключают проблему лишнего хвоста в принципе.

Если строка собирается из множества частей, предпочтительнее массив и СтрСоединить: код короче, быстрее работает и не требует обрезки последнего разделителя вообще.
ПЗ
Практическое замечание

Нюансы: переносы строк, пробелы и невидимые символы

Последний символ строки не всегда тот, что видно на экране. Строки, полученные из файлов, буфера обмена или многострочных полей, часто заканчиваются переносом строки (Символы.ПС), возвратом каретки или неразрывным пробелом. Обрезка «одного последнего символа» тогда удаляет служебный символ, а видимый текст остаётся нетронутым.

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

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

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

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

Длина строки после обрезки
Норма

Уменьшилась ровно на 1 (или на N при удалении нескольких символов)

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

Длина не изменилась или строка стала пустой неожиданно

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

Это ожидаемый символ содержимого, без запятой, пробела или переноса

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

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

Поведение на пустой строке
Норма

Код отрабатывает без ошибки и возвращает пустую строку

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

Возникает ошибка выполнения или исключение

Типичные ошибки при удалении последнего символа

Большинство проблем с этой простой операцией связано не с синтаксисом, а с невнимательностью к данным. Ниже — ошибки, которые встречаются чаще всего.

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

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

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

Проверить обрезку проще всего через вывод в сообщение или в отладчике. Полезно выводить не только саму строку, но и её длину до и после — так сразу видно, сработала ли операция.

Сообщить("Было: [" + Строка + "], длина " + СтрДлина(Строка));

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

Сообщить("Стало: [" + Строка + "], длина " + СтрДлина(Строка));

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

При пакетной обработке данных (например, обрезке тысяч строк в обработке) имеет смысл сначала выполнить проход в режиме «только проверка»: посчитать, у скольких строк последний символ совпадает с ожидаемым, и вывести примеры расхождений. Это защищает от массовой порчи данных.

Порядок действий
  1. 1
    Убедитесь, что значение является строкой; при необходимости приведите через Строка() или Формат().
  2. 2
    Проверьте, что строка не пустая: Если Не ПустаяСтрока(Строка) Тогда.
  3. 3
    При необходимости проверьте последний символ через Прав(Строка, 1).
  4. 4
    Выполните обрезку: Строка = Лев(Строка, СтрДлина(Строка) - 1).
  5. 5
    Проверьте результат: длина уменьшилась на 1, последний символ соответствует ожиданию.
Итог

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

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

Частые вопросы

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

В языке запросов есть функции ЛЕВСТРОКА(Строка, Длина) и ДЛИНАСТРОКИ(Строка). Конструкция вида ЛЕВСТРОКА(Поле, ДЛИНАСТРОКИ(Поле) - 1) работает, но с пустыми значениями и NULL нужна осторожность: NULL-поля лучше отфильтровать или обработать через ЕСТЬNULL и ВЫБОР.

Как удалить несколько последних символов, а не один?

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

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

Проверьте последний символ условием: Если Прав(Строка, 1) = "," Тогда Строка = Лев(Строка, СтрДлина(Строка) - 1); КонецЕсли. Так строки без запятой в конце останутся нетронутыми.

Почему после обрезки в конце строки всё равно что-то осталось?

Чаще всего в конце строки находится невидимый символ: пробел, перенос строки, табуляция. Обрезка удалила его, а видимый символ остался. Проверьте код последнего символа через КодСимвола(Прав(Строка, 1)) и при необходимости примените СокрП() или повторную обрезку.

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

Да, через Сред(Строка, 1, СтрДлина(Строка) - 1) — но длину всё равно придётся вычислять. Способа обрезать строку «с конца» без определения её длины во встроенном языке 1С нет.

Работает ли этот способ на управляемых формах и в веб-клиенте?

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