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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование функций Лев() и СтрДлина()

Это классический и самый производительный способ. Суть заключается в том, чтобы «отрезать» от исходной строки подстроку, длина которой на один символ меньше оригинала. Проанализируем, как это реализовать на практике.

Допустим, у нас есть строка КодКР, которая заканчивается запятой, и нам нужно ее удалить. Посмотрим на пример кода:


Если СтрЗаканчиваетсяНа(Стр.КодКР, ",") Тогда
    ТЧ.Параметры.НомерКР = Лев(Стр.КодКР, СтрДлина(Стр.КодКР) - 1);
КонецЕсли;

В данном примере мы сначала проверяем условие с помощью функции СтрЗаканчиваетсяНа(). Если условие истинно, мы берем левую часть строки Лев(), вычисляя ее новую длину как СтрДлина() - 1. Это надежный метод, который работает корректно в любой версии платформы 8.x.

Метод 2: Замена последнего символа на другой (например, на пробел)

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

Разберем следующий вариант решения:


Если Прав(Стр.КодКР, 1) = "," Тогда
    Стр.КодКР = Лев(Стр.КодКР, СтрДлина(Стр.КодКР) - 1) + " ";
КонецЕсли;

Здесь мы используем функцию Прав(), чтобы получить ровно один символ с правого края. Если это запятая, мы выполняем замену. Обратите внимание, что использование Лев() вместе с СтрДлина() позволяет нам точно контролировать позицию замены, в отличие от функции СтрЗаменить(), которая заменяет все вхождения символа в строке.

Метод 3: Использование тернарного оператора для компактности

Если вы стремитесь к лаконичности кода, можно использовать встроенную функцию ?() (аналог тернарного оператора). Это позволяет выполнить проверку и замену в одну строку кода.

Посмотрим на пример:


Стр.КодКР = ?(Прав(Стр.КодКР, 1) = ",", Лев(Стр.КодКР, СтрДлина(Стр.КодКР) - 1) + " ", Стр.КодКР);

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

Метод 4: Использование функций СтрРазделить() и СтрСоединить()

Этот метод считается более «экзотическим», но он демонстрирует мощь работы с массивами строк. Рассмотрим ситуацию, когда в конце строки может быть пустой элемент после разделителя. Для решения обратной задачи — импорта данных из таких списков — можно использовать алгоритм разбора CSV-строк без регулярных выражений.


МассивСтрок = СтрРазделить(Стр.КодКР, ",", Ложь);
Если МассивСтрок.Количество() > 0 И МассивСтрок[МассивСтрок.Количество() - 1] = "" Тогда
    МассивСтрок.Удалить(МассивСтрок.Количество() - 1);
    Стр.КодКР = СтрСоединить(МассивСтрок, ",") + " ";
КонецЕсли;

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

Нюансы производительности и возможные ошибки

При работе со строками в 1С важно учитывать несколько критических моментов, которые часто упускают начинающие разработчики:

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

Использование регулярных выражений (для продвинутых задач)

Если вам необходимо заменить последний символ, но условия поиска более сложные (например, заменить любой знак препинания в конце строки), лучше всего использовать регулярные выражения. Начиная с версии платформы 8.3.24, в 1С появились встроенные объекты для работы с RegEx.

Проанализируем пример с использованием нового объекта РезультатПоискаРегулярногоВыражения:


// Пример для платформы 8.3.24+
РегВыр = Новый РегулярноеВыражение(",$"); // Ищем запятую ($ - признак конца строки)
Стр.КодКР = РегВыр.Заменить(Стр.КодКР, " ");

Для более старых версий платформы можно использовать COM-объект VBScript.RegExp. Это гарантирует, что замена произойдет только в последней позиции, независимо от того, сколько запятых содержится в середине текста.

Рекомендации по выбору метода

Подведем итог нашему анализу:

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

← На главную