При обработке текстовых данных, особенно загруженных из внешних файлов (Excel, CSV, веб-сервисов), разработчики часто сталкиваются с ситуацией, когда стандартные функции обрезки пробелов, такие как СокрЛП() или СокрП(), не отсекают символы в конце строки. Рассмотрим подробнее, почему возникают пробелы справа и как корректно очистить строку от нежелательных символов.
Если строка продолжает содержать пробелы справа даже после применения функции СокрЛП(), проанализируем две наиболее частые причины этого поведения:
Символы.НПП (код 160), символы табуляции Символы.Таб или переводы строк. Функция СокрЛП() удаляет только обычные пробелы, оставляя неразрывные без изменений.ДопустимаяДлина.Фиксированная), платформа 1С автоматически дополняет любую строку стандартными пробелами справа до заданной длины.Разберем, как удалить спецсимволы перед выполнением обычной обрезки. Для этого воспользуемся функцией СтрЗаменить(), передав в качестве заменяемого значения неразрывный пробел Символы.НПП или символ с кодом 160.
Посмотрим на пример кода, который сначала удаляет неразрывные пробелы, а затем выполняет обрезку стандартных пробелов с помощью СокрЛП():
// Заменяем неразрывный пробел на пустую строку и отсекаем обычные пробелы
СтрокаОчищенная = СокрЛП(СтрЗаменить(ИсходнаяСтрока, Символы.НПП, ""));
Если в конце строки могут находиться и другие непечатные символы, проверим код символа в цикле или выполним последовательную замену управляющих символов:
// Замена основных спецсимволов
СтрокаОчищенная = ИсходнаяСтрока;
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, Символы.НПП, "");
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, Символы.Таб, "");
СтрокаОчищенная = СокрЛП(СтрокаОчищенная);
Проанализируем ситуацию, когда точный код спецсимвола неизвестен. В этом случае пройдем по строке с правого края с помощью функций КодСимвола(), СтрДлина() и Лев(). Это позволит отсечь любые невидимые знаки с кодами меньше или равными 32, а также код 160.
Рассмотрим пример функции для обрезки спецсимволов справа:
Функция ОчиститьПробелыСправа(Знач Текст)
Пока СтрДлина(Текст) > 0 Цикл
Код = КодСимвола(Прав(Текст, 1));
// Проверяем обычные пробелы (<=32) и неразрывный пробел (160)
Если Код <= 32 Или Код = 160 Тогда
Текст = Лев(Текст, СтрДлина(Текст) - 1);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Текст;
КонецФункции
Если очистка строки выполняется правильно, но при сохранении в реквизит или выгрузке в таблицу значений пробелы появляются снова, проанализируем настройки метаданных.
Фиксированная, изменим его на Переменная.При программном создании колонок таблицы значений укажем квалификаторы строки с переменной длиной:
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
Квалификаторы = Новый КвалификаторыСтроки(20, ДопустимаяДлина.Переменная);
ОписаниеТипа = Новый ОписаниеТипов(МассивТипов, , Квалификаторы);
ТаблицаЗначений.Колонки.Добавить("Артикул", ОписаниеТипа);
После изменения режима длины строки на переменный платформа перестанет дополнять значения пробелами справа.