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

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

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

Выясним причину: почему пробелы не удаляются

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

  1. Неразрывные пробелы и служебные символы. При выгрузке из сторонних программ (например, Microsoft Excel) вместо стандартного пробела (ASCII-код 32) в конце строки часто используются неразрывный пробел Символы.НПП (код 160), символы табуляции Символы.Таб или переводы строк. Функция СокрЛП() удаляет только обычные пробелы, оставляя неразрывные без изменений.
  2. Фиксированная длина строки у реквизита или колонки. Если значение записывается в реквизит справочника, документа или колонку таблицы значений с типом строки фиксированной длины (ДопустимаяДлина.Фиксированная), платформа 1С автоматически дополняет любую строку стандартными пробелами справа до заданной длины.

Способ 1. Замена неразрывных пробелов и спецсимволов

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

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


// Заменяем неразрывный пробел на пустую строку и отсекаем обычные пробелы
СтрокаОчищенная = СокрЛП(СтрЗаменить(ИсходнаяСтрока, Символы.НПП, ""));

Если в конце строки могут находиться и другие непечатные символы, проверим код символа в цикле или выполним последовательную замену управляющих символов:


// Замена основных спецсимволов
СтрокаОчищенная = ИсходнаяСтрока;
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, Символы.НПП, "");
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, Символы.Таб, "");
СтрокаОчищенная = СокрЛП(СтрокаОчищенная);

Способ 2. Проверка кода последнего символа в цикле

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

Рассмотрим пример функции для обрезки спецсимволов справа:


Функция ОчиститьПробелыСправа(Знач Текст)
    Пока СтрДлина(Текст) > 0 Цикл
        Код = КодСимвола(Прав(Текст, 1));
        // Проверяем обычные пробелы (<=32) и неразрывный пробел (160)
        Если Код <= 32 Или Код = 160 Тогда
            Текст = Лев(Текст, СтрДлина(Текст) - 1);
        Иначе
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Возврат Текст;
КонецФункции

Способ 3. Изменение типа длины строки в метаданных

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

  1. В дереве конфигурации откроем свойства реквизита (например, артикула или кода поставщика).
  2. В поле Длина проверим настройку допустимой длины.
  3. Если установлено значение Фиксированная, изменим его на Переменная.

При программном создании колонок таблицы значений укажем квалификаторы строки с переменной длиной:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
Квалификаторы = Новый КвалификаторыСтроки(20, ДопустимаяДлина.Переменная);
ОписаниеТипа = Новый ОписаниеТипов(МассивТипов, , Квалификаторы);

ТаблицаЗначений.Колонки.Добавить("Артикул", ОписаниеТипа);

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

← На главную