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