Почему Функция СтрЗаменить Не Удаляет Пробелы Из Строки В 1С И Как Это Исправить?

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

При разработке и обработке текстовых данных в 1С разработчики часто сталкиваются с ситуацией, когда стандартная конструкция СтрЗаменить(Стр, " ", "") визуально выглядит правильно, но не производит замену пробелов в строке. В результате строки с числовыми данными не поддаются преобразованию в числовой тип с помощью функции Число(), вызывая ошибку времени выполнения.

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

Анализ проблемы: почему обычная замена не работает

Проанализируем ситуацию: визуально символ в строке выглядит как обычный пробел, однако его Юникод-код отличается от стандартного пробела (код 32). В платформе 1С при преобразовании чисел в строку или при формировании отчетов в качестве разделителя групп разрядов используется неразрывный пробел (в синтаксисе 1С — системная константа Символы.НПП или символ с кодом 160).

Кроме того, при выгрузке или копировании данных из внешних источников (файлы Excel, PDF, JSON/XML, веб-страницы) в строке могут присутствовать другие символы форматирования:

  1. Неразрывный пробел (Символы.НПП / Символ(160)).
  2. Табуляция (Символы.Таб / Символ(9)).
  3. Перенос строки и возврат каретки (Символы.ПС, Символы.ВК).
  4. Пробелы нулевой ширины и специальные символы Юникода.

Поскольку функция СтрЗаменить ищет точное совпадение подстроки, указанный в параметре обычный пробел " " просто не находится в тексте, содержащем неразрывные пробелы.

Способ 1. Замена неразрывного пробела через системную константу или код символа

Рассмотрим базовое и самое распространенное решение. Если задача состоит в том, чтобы очистить строку, полученную после форматирования числа или из стандартных механизмов 1С, необходимо выполнить замену с использованием системной константы Символы.НПП.

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


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

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

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


// Замена по коду неразрывного пробела
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");

Способ 2. Очистка строки с помощью функции СтрРазбить и СтрСоединить

Разберем по шагам альтернативный вариант с разбиением строки на массив фрагментов. Функция СтрРазбить с параметром отсечения пустых строк позволяет удалить все разделители из текста:


// Разбиваем строку по неразрывному пробелу, исключая пустые элементы
МассивФрагментов = СтрРазбить(ИсходнаяСтрока, Символы.НПП, Ложь);

// Собираем строку обратно без разделителей
ОчищеннаяСтрока = СтрСоединить(МассивФрагментов, "");

Способ 3. Использование регулярных выражений (для платформы 8.3.23 и выше)

Если вы работаете на современных версиях платформы 1С:Предприятие (начиная с 8.3.23), наиболее универсальным решением будет применение встроенных функций для работы с регулярными выражениями. Паттерн \s+ покрывает сразу все виды пробельных символов (обычные и неразрывные пробелы, табуляции и переносы строк).

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


// Замена всех пробельных символов одной функцией
ОчищеннаяСтрока = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, "\s+", "");

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


РегЭксп = Новый COMОбъект("VBScript.RegExp");
РегЭксп.Global = Истина;
РегЭксп.Pattern = "\s+";
ОчищеннаяСтрока = РегЭксп.Replace(ИсходнаяСтрока, "");

Преобразование очищенной строки в число

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


// Полный цикл подготовки и преобразования строки в число
СтрокаЧисла = "1 500 000,50"; // Содержит неразрывные пробелы
ПодготовленнаяСтрока = СтрЗаменить(СтрЗаменить(СтрокаЧисла, Символы.НПП, ""), " ", "");

// Преобразуем очищенную строку в числовой тип
ЧисловоеЗначение = Число(ПодготовленнаяСтрока);

Использование правильных символов разделителей и методов их удаления позволяет избежать ошибок при парсинге данных из внешних систем и при преобразовании типов внутри платформы 1С.

← На главную