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

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

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

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

Во встроенном языке 1С нет отдельной функции «последний символ», но задача решается двумя штатными способами: функцией Прав(), которая возвращает заданное количество символов с конца строки, и связкой Сред() + СтрДлина(), которая вырезает символ по его позиции. Оба варианта работают в тонком, толстом и веб-клиенте, на сервере и в мобильной платформе.

Чаще всего последний символ нужен для проверки служебных признаков: заканчивается ли путь на разделитель каталога, есть ли точка в конце предложения, какой суффикс у номера документа или артикула. От корректности этой проверки зависят дальнейшие ветвления алгоритма, поэтому важно учитывать пустые строки и пробельные символы в конце.

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

Способ 1: функция Прав() — самый короткий вариант

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

Строка = "Привет, мир!";

ПоследнийСимвол = Прав(Строка, 1);

// Результат: "!"

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

Функция работает и с многострочным текстом: последним символом может оказаться перевод строки или символ табуляции, если текст заканчивается ими. Это частая причина «непонятного» поведения при сравнении результата с ожидаемым значением.

bsl
ПоследнийСимвол = Прав(ИсходнаяСтрока, 1);

Способ 2: Сред() и СтрДлина() — через позицию символа

Второй вариант — вычислить позицию последнего символа через длину строки и вырезать его функцией Сред(). Нумерация символов в 1С начинается с 1, поэтому позиция последнего символа равна длине строки:

Строка = "Артикул-001";

Длина = СтрДлина(Строка);

ПоследнийСимвол = Сред(Строка, Длина, 1);

// Результат: "1"

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

По производительности разницы между двумя способами на практике нет — обе операции выполняются за постоянное время. Выбирайте по читаемости кода в конкретном месте.

Обработка пустых строк и граничных случаев

Главный риск при работе с последним символом — пустая строка. Прав("", 1) вернёт пустую строку без ошибки, а Сред("", 0, 1) с длиной 0 также не вызовет исключения, но дальнейшее сравнение результата с ожидаемым символом даст ложный результат логики. Поэтому перед извлечением символа проверяйте длину:

Если СтрДлина(Строка) > 0 Тогда

ПоследнийСимвол = Прав(Строка, 1);

Иначе

ПоследнийСимвол = "";

КонецЕсли;

Вторая ловушка — непечатаемые символы в конце: пробелы, табуляции, переводы строк. Если строка пришла из файла, формы или обмена, сначала примените СокрП(), чтобы отрезать незначащие символы справа, и только потом берите последний символ. Иначе вместо ожидаемой буквы вы получите пробел.

Порядок действий
  1. 1
    Очистите строку справа: Строка = СокрП(Строка).
  2. 2
    Проверьте длину: СтрДлина(Строка) > 0.
  3. 3
    Получите символ: Прав(Строка, 1).
  4. 4
    Сравните с ожидаемым значением с учётом регистра при необходимости.

Сравнение символа с учётом и без учёта регистра

Оператор сравнения «=» в 1С для строк работает без учёта регистра и без учёта концевых пробелов. Это значит, что проверка ПоследнийСимвол = "А" сработает и для «а», и для «А». Для служебных символов (точка, слэш, цифра) это не важно, но для буквенных кодов — критично.

Если регистр имеет значение, используйте точное посимвольное сравнение через КодСимвола(): сравните код полученного символа с кодом эталона. Либо приведите обе стороны к одному регистру функциями ВРег() или НРег(), если нужно наоборот игнорировать регистр явно.

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

// точное совпадение с учётом регистра

КонецЕсли;

Практические сценарии использования

Проверка разделителя в конце пути

Типовая задача при формировании полного имени файла — гарантировать, что каталог заканчивается на разделитель. Шаблон кода:

Каталог = СокрП(Каталог);

Если СтрДлина(Каталог) > 0

И Прав(Каталог, 1) <> "\" Тогда

Каталог = Каталог + "\";

КонецЕсли;

ПолноеИмя = Каталог + ИмяФайла;

Удаление последнего символа

Обратная задача — отрезать последний символ, например лишнюю запятую после цикла конкатенации. Используйте Лев() с длиной минус один:

Если СтрДлина(Строка) > 0 Тогда

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

КонецЕсли;

Последнее слово или расширение файла

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

ПозицияТочки = СтрНайти(ИмяФайла, ".", НаправлениеПоиска.СКонца);

Если ПозицияТочки > 0 Тогда

Расширение = Сред(ИмяФайла, ПозицияТочки + 1);

КонецЕсли;

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

Прав(Строка, 1)

Самый короткий и читаемый способ получить последний символ. Ограничение: не даёт позицию символа.

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

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

СтрНайти(..., СКонца) + Сред()

Для фрагментов переменной длины: расширение файла, последнее слово. Избыточен для одного символа.

Типичные ошибки и как их избежать

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

Вторая ошибка — сравнение результата с числом. Прав() всегда возвращает строку, даже если в ней цифра. Сравнение Прав(Строка, 1) = 5 может дать неожиданный результат из-за неявного преобразования типов. Приводите значение явно через Число() или сравнивайте со строковым литералом "5".

Третья ошибка — игнорирование многострочности. Функция СтрДлина() считает все символы, включая переводы строк. Если текст заканчивается переводом строки, последним символом будет именно он. Для работы с последней строкой многострочного текста используйте СтрЧислоСтрок() и СтрПолучитьСтроку().

Типичные ошибки
01
Считать, что нумерация символов с нуля — Сред() вернёт предпоследний символ вместо последнего.
02
Забыть СокрП() для строк из файлов и форм — в конце окажется пробел или перевод строки.
03
Сравнивать результат Прав() с числом без явного преобразования типов.
04
Не проверять длину пустой строки — последующая логика получит пустой символ и отработает неверно.

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

Быстрее всего проверить код в конфигураторе через «Табло» (отладка) или вывести результат через Сообщить(). При отладке обращайте внимание не только на видимый символ, но и на длину результата: если СтрДлина(ПоследнийСимвол) = 1, а на экране «ничего нет» — это непечатаемый символ, и его код можно посмотреть через КодСимвола().

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

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

Длина результата
Норма

СтрДлина(Прав(Строка, 1)) = 1

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

Длина 0 — исходная строка была пустой

Видимый символ
Норма

Символ совпадает с ожидаемым

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

Пустое место — это пробел, табуляция или перевод строки

Код символа
Норма

КодСимвола() возвращает код ожидаемого знака

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

Код 10, 13 или 32 — в конце строки служебный символ

Итог

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

Последний символ строки в 1С — это Прав(Строка, 1). Перед вызовом очищайте строку через СокрП() и проверяйте длину. Для фрагментов переменной длины используйте СтрНайти() с поиском с конца.

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

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

Передайте в Прав() нужное количество: Прав(Строка, 3) вернёт три последних символа. Если строка короче указанного числа, функция вернёт её целиком без ошибки.

Что вернёт Прав() для пустой строки?

Пустую строку, без исключения. Поэтому перед извлечением символа проверяйте СтрДлина(Строка) > 0, особенно если значение пришло из реквизита, файла или запроса.

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

Используйте КодСимвола(Прав(Строка, 1)). Это удобно для точного сравнения с учётом регистра и для диагностики непечатаемых символов: пробел — 32, перевод строки — 10, возврат каретки — 13.

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

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

Как получить последнюю строку многострочного текста?

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

Работает ли Прав() на сервере и в мобильной платформе?

Да, функции работы со строками — Прав, Лев, Сред, СтрДлина, СтрНайти — доступны во всех режимах исполнения: тонкий и толстый клиент, веб-клиент, сервер, мобильная платформа, внешнее соединение.