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

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

Проблема «лишних» пробелов — одна из самых частых при интеграции 1С с внешними системами, особенно при загрузке данных из Excel или веб-сервисов. Часто визуально строка выглядит чистой, но программная обработка дает сбой: числа не суммируются, поиск не находит соответствия, а условия Если выдают Ложь. В этой статье мы подробно разберем все способы очистки строк, от простейших встроенных функций до продвинутых методов с использованием регулярных выражений.

Разбираем причины: почему обычный СтрЗаменить не всегда работает

Часто программисты пытаются решить задачу «в лоб», используя конструкцию СтрЗаменить(Строка, " ", ""). Однако это помогает только в случае стандартного пробела (символ с кодом 32). На практике в данных часто встречаются «невидимые» вредители. Проанализируем самые популярные из них:

  1. Неразрывный пробел (NBSP) — имеет код 160. Он часто используется в Excel как разделитель групп разрядов в числах.
  2. Узкий неразрывный пробел — символ с кодом 8239, часто встречается в современном ПО.
  3. Табуляция — символы Символы.Таб или Символы.ВТаб.
  4. Переносы строк — Символы.ПС (перевод строки) или Символы.ВК (возврат каретки).

Чтобы выяснить, какой именно символ мешает работе, рекомендуется использовать функцию КодСимвола(Строка, НомерСимвола). Это позволит точно определить «врага» в лицо.

Метод 1: Очистка краев и удаление неразрывных пробелов

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


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

Обратите внимание, что в платформе 1С 8.x существует системная константа Символы.НПП, которая соответствует неразрывному пробелу. В старых версиях (7.7) или для надежности можно использовать прямое указание кода: Символ(160).

Метод 2: Удаление лишних пробелов внутри текста (нормализация)

Рассмотрим ситуацию, когда нам нужно не просто удалить все пробелы, а оставить только по одному между словами (например, при очистке ФИО или наименования номенклатуры). Если в строке «Иванов Иван Иванович» нужно убрать лишнее, есть два пути.

Путь А: Цикл (классический метод)

Мы будем заменять двойные пробелы на одинарные до тех пор, пока они не закончатся:


Пока Найти(ФИО, "  ") > 0 Цикл
    ФИО = СтрЗаменить(ФИО, "  ", " ");
КонецЦикла;
ФИО = СокрЛП(ФИО);

Путь Б: Использование СтрРазделить (современный метод)

Этот способ работает быстрее и изящнее. Мы разбиваем строку в массив, игнорируя пустые элементы, а затем собираем её обратно:


ЧастиСтроки = СтрРазделить(ИсходнаяСтрока, " ", Ложь); // Ложь означает не включать пустые строки
Результат = СтрСоединить(ЧастиСтроки, " ");

Этот метод автоматически убирает любое количество пробелов между словами, превращая их в один разделитель.

Метод 3: Работа с числами из Excel

При загрузке сумм из Excel мы часто сталкиваемся с тем, что 1С не может преобразовать строку в число из-за разделителей групп разрядов. Посмотрим на эффективный способ подготовки строки к преобразованию:


// Очищаем строку от пробелов и приводим десятичную точку к системному виду
СуммаСтр = СтрЗаменить(СуммаИзЭксель, Символы.НПП, "");
СуммаСтр = СтрЗаменить(СуммаСтр, " ", "");
СуммаСтр = СтрЗаменить(СуммаСтр, ".", ","); // Заменяем точку на запятую для функции Число()
Попытка
    НужноеЧисло = Число(СуммаСтр);
Исключение
    НужноеЧисло = 0;
КонецПопытки;

Если вы работаете через COM-объект, проанализируйте свойство Value2 ячейки Excel вместо Text или Value. Свойство Value2 часто возвращает «чистое» значение без форматирования (пробелов-разделителей).

Метод 4: Регулярные выражения (RegExp)

Когда нужно очистить строку сразу от всех видов пробельных и непечатных символов, лучше всего использовать объект VBScript.RegExp. Это «тяжелая артиллерия», которая за один проход уберет всё лишнее.


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;

// Паттерн \s находит любой пробельный символ (пробел, табуляция, НПП, перенос строки)
RegExp.Pattern = "\s+"; 

// Заменяем все найденные группы пробелов на один обычный пробел
Результат = RegExp.Replace(ИсходнаяСтрока, " ");

Универсальная функция нормализации строки

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


&НаСервере
Функция ОчиститьСтрокуОтМусора(Знач ИсходнаяСтрока) Экспорт
    
    Если ТипЗнч(ИсходнаяСтрока) <> Тип("Строка") Тогда
        Возврат Строка(ИсходнаяСтрока);
    КонецЕсли;
    
    // 1. Удаляем неразрывные пробелы
    Результат = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, " ");
    
    // 2. Удаляем специфические непечатные символы (таб, переносы и т.д.)
    Результат = СтрЗаменить(Результат, Символы.ВТаб, "");
    Результат = СтрЗаменить(Результат, Символы.ПС, "");
    Результат = СтрЗаменить(Результат, Символы.ВК, "");
    Результат = СтрЗаменить(Результат, Символы.Таб, "");
    
    // 3. Схлопываем множественные пробелы через массив
    МассивСлов = СтрРазделить(Результат, " ", Ложь);
    Результат = СтрСоединить(МассивСлов, " ");
    
    Возврат СокрЛП(Результат);
    
КонецФункции

Подведем итоги

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

← На главную