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

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

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

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

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

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

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

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

ИсходнаяСтрока = "Товар1,Товар2,Товар3,";

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

// Результат: "Товар1,Товар2,Товар3;"

Этот подход работает с любыми символами, включая спецсимволы и кириллицу, и не зависит от содержимого строки. Именно его стоит использовать по умолчанию, когда нужно заменить последний символ в строке 1С без дополнительных условий.

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

СтрокаБезПоследнего = Лев(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1);
1c
НоваяСтрока = Лев(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1) + "НовыйСимвол";

Защита от пустой и короткой строки

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

Строка из одного символа — ещё один граничный случай: Лев(Строка, 0) вернёт пустую строку, и результатом будет просто новый символ. Иногда это допустимо, иногда — ошибка бизнес-логики. Поэтому перед заменой добавьте проверку длины.

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

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

Иначе

НоваяСтрока = ИсходнаяСтрока; // или другое действие по умолчанию

КонецЕсли;

Условная замена: только если последний символ совпадает

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

Если СтрДлина(ИсходнаяСтрока) > 0 И Прав(ИсходнаяСтрока, 1) = "," Тогда

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

Иначе

НоваяСтрока = ИсходнаяСтрока;

КонецЕсли;

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

Для проверки нескольких допустимых символов удобно использовать СтрНайти: например, Если СтрНайти(",;.", Прав(Строка, 1)) > 0 Тогда.. — условие сработает, если строка заканчивается запятой, точкой с запятой или точкой.

Альтернативные способы и когда они уместны

Функция СтрЗаменить(Строка, ЧтоЗаменить, НаЧто) заменяет все вхождения подстроки, а не только последний символ. Использовать её для этой задачи напрямую нельзя: СтрЗаменить("а,б,", ",", ";") заменит обе запятые. Она подходит, только если заменяемый символ гарантированно встречается один раз — но тогда проще базовый способ.

В толстом клиенте и на сервере доступны регулярные выражения через COM-объект VBScript.RegExp (только Windows) или аналогичные механизмы. Паттерн .$ находит последний символ строки. Это оправдано при сложных шаблонах, но для простой замены одного символа — избыточно и медленнее, чем Лев + СтрДлина.

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

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

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

Универсальный и быстрый способ, работает везде. Ограничение — требует проверки длины строки.

Прав + условие

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

СтрЗаменить

Заменяет все вхождения, а не только последний — для этой задачи применим редко.

Регулярные выражения

Гибко для сложных шаблонов, но избыточно для одного символа и зависит от платформы.

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

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

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

Для Каждого Элемент Из СписокЗначений Цикл

Результат = Результат + Элемент + ",";

КонецЦикла;

// Убираем последнюю запятую

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

Результат = Лев(Результат, СтрДлина(Результат) - 1);

КонецЕсли;

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

Порядок действий
  1. 1
    Проверьте, что строка не пустая: СтрДлина(Строка) > 0
  2. 2
    При необходимости убедитесь, что последний символ именно тот: Прав(Строка, 1) = ","
  3. 3
    Сформируйте новую строку: Лев(Строка, СтрДлина(Строка) - 1) + "НовыйСимвол"
  4. 4
    Проверьте результат на тестовых данных, включая строку из одного символа

Невидимые символы и типичные ошибки

Частая ситуация: замена «не работает», потому что последний видимый символ — не последний на самом деле. В конце строки могут быть пробел, символ табуляции или перенос строки (Символы.ПС), особенно если данные пришли из файла, буфера обмена или внешней системы. Тогда Прав(Строка, 1) вернёт невидимый символ, и условие не сработает.

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

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

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

Длина новой строки
Норма

Равна длине исходной (символ заменён) или на 1 меньше (символ удалён)

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

Длина изменилась больше чем на 1 — лишняя операция

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

Прав(Результат, 1) равен нужному символу

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

Там пробел, перенос строки или старый символ

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

Код отрабатывает без ошибки, результат контролируем

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

Ошибка выполнения или неожиданное значение

FAQ

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

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

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

Тот же принцип: Лев(Строка, СтрДлина(Строка) - N) + "НовыйТекст", где N — количество отрезаемых символов. Проверяйте, что длина строки больше N.

Почему условие Прав(Строка, 1) = "," не срабатывает?

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

Можно ли заменить последний символ через СтрЗаменить?

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

Нумерация символов в 1С начинается с 0 или с 1?

С 1. Первый символ строки — это Сред(Строка, 1, 1), а последний — Сред(Строка, СтрДлина(Строка), 1) или Прав(Строка, 1).

Что быстрее: обрезка последнего символа или СтрСоединить?

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

Итог

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

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