Проблема «лишних» пробелов — одна из самых частых при интеграции 1С с внешними системами, особенно при загрузке данных из Excel или веб-сервисов. Часто визуально строка выглядит чистой, но программная обработка дает сбой: числа не суммируются, поиск не находит соответствия, а условия Если выдают Ложь. В этой статье мы подробно разберем все способы очистки строк, от простейших встроенных функций до продвинутых методов с использованием регулярных выражений.
Часто программисты пытаются решить задачу «в лоб», используя конструкцию СтрЗаменить(Строка, " ", ""). Однако это помогает только в случае стандартного пробела (символ с кодом 32). На практике в данных часто встречаются «невидимые» вредители. Проанализируем самые популярные из них:
Символы.Таб или Символы.ВТаб.Символы.ПС (перевод строки) или Символы.ВК (возврат каретки).Чтобы выяснить, какой именно символ мешает работе, рекомендуется использовать функцию КодСимвола(Строка, НомерСимвола). Это позволит точно определить «врага» в лицо.
Если нам нужно убрать пробелы только по краям, мы используем стандартную функцию СокрЛП(). Но помните: она не трогает пробелы внутри строки и не всегда справляется с неразрывными пробелами. Для комплексной очистки от неразрывного пробела (код 160) используем следующий подход:
// Удаляем неразрывные пробелы и обычные пробелы по всей строке
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", "");
Обратите внимание, что в платформе 1С 8.x существует системная константа Символы.НПП, которая соответствует неразрывному пробелу. В старых версиях (7.7) или для надежности можно использовать прямое указание кода: Символ(160).
Рассмотрим ситуацию, когда нам нужно не просто удалить все пробелы, а оставить только по одному между словами (например, при очистке ФИО или наименования номенклатуры). Если в строке «Иванов Иван Иванович» нужно убрать лишнее, есть два пути.
Путь А: Цикл (классический метод)
Мы будем заменять двойные пробелы на одинарные до тех пор, пока они не закончатся:
Пока Найти(ФИО, " ") > 0 Цикл
ФИО = СтрЗаменить(ФИО, " ", " ");
КонецЦикла;
ФИО = СокрЛП(ФИО);
Путь Б: Использование СтрРазделить (современный метод)
Этот способ работает быстрее и изящнее. Мы разбиваем строку в массив, игнорируя пустые элементы, а затем собираем её обратно:
ЧастиСтроки = СтрРазделить(ИсходнаяСтрока, " ", Ложь); // Ложь означает не включать пустые строки
Результат = СтрСоединить(ЧастиСтроки, " ");
Этот метод автоматически убирает любое количество пробелов между словами, превращая их в один разделитель.
При загрузке сумм из Excel мы часто сталкиваемся с тем, что 1С не может преобразовать строку в число из-за разделителей групп разрядов. Посмотрим на эффективный способ подготовки строки к преобразованию:
// Очищаем строку от пробелов и приводим десятичную точку к системному виду
СуммаСтр = СтрЗаменить(СуммаИзЭксель, Символы.НПП, "");
СуммаСтр = СтрЗаменить(СуммаСтр, " ", "");
СуммаСтр = СтрЗаменить(СуммаСтр, ".", ","); // Заменяем точку на запятую для функции Число()
Попытка
НужноеЧисло = Число(СуммаСтр);
Исключение
НужноеЧисло = 0;
КонецПопытки;
Если вы работаете через COM-объект, проанализируйте свойство Value2 ячейки Excel вместо Text или Value. Свойство Value2 часто возвращает «чистое» значение без форматирования (пробелов-разделителей).
Когда нужно очистить строку сразу от всех видов пробельных и непечатных символов, лучше всего использовать объект VBScript.RegExp. Это «тяжелая артиллерия», которая за один проход уберет всё лишнее.
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// Паттерн \s находит любой пробельный символ (пробел, табуляция, НПП, перенос строки)
RegExp.Pattern = "\s+";
// Заменяем все найденные группы пробелов на один обычный пробел
Результат = RegExp.Replace(ИсходнаяСтрока, " ");
Объединим лучшие практики в одну универсальную функцию, которую вы сможете использовать в своих обработках. Она удаляет неразрывные пробелы, схлопывает двойные пробелы и чистит непечатные символы.
&НаСервере
Функция ОчиститьСтрокуОтМусора(Знач ИсходнаяСтрока) Экспорт
Если ТипЗнч(ИсходнаяСтрока) <> Тип("Строка") Тогда
Возврат Строка(ИсходнаяСтрока);
КонецЕсли;
// 1. Удаляем неразрывные пробелы
Результат = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, " ");
// 2. Удаляем специфические непечатные символы (таб, переносы и т.д.)
Результат = СтрЗаменить(Результат, Символы.ВТаб, "");
Результат = СтрЗаменить(Результат, Символы.ПС, "");
Результат = СтрЗаменить(Результат, Символы.ВК, "");
Результат = СтрЗаменить(Результат, Символы.Таб, "");
// 3. Схлопываем множественные пробелы через массив
МассивСлов = СтрРазделить(Результат, " ", Ложь);
Результат = СтрСоединить(МассивСлов, " ");
Возврат СокрЛП(Результат);
КонецФункции
Для эффективной очистки данных в 1С важно понимать природу символов. Всегда проверяйте код символа, если стандартные методы не помогают. Для простых задач используйте СокрЛП() и СтрЗаменить(), для удаления лишних пробелов в середине текста применяйте связку СтрРазделить() и СтрСоединить(), а для сложной очистки больших массивов данных — регулярные выражения. Это гарантирует чистоту вашей базы данных и отсутствие ошибок при вычислениях.