При разработке и обработке текстовых данных в 1С разработчики часто сталкиваются с ситуацией, когда стандартная конструкция СтрЗаменить(Стр, " ", "") визуально выглядит правильно, но не производит замену пробелов в строке. В результате строки с числовыми данными не поддаются преобразованию в числовой тип с помощью функции Число(), вызывая ошибку времени выполнения.
В этой статье мы подробно разберем причину такого поведения платформы 1С, выясним причину появления «невидимых» символов и рассмотрим эффективные способы полной очистки строки от любых видов пробельных символов.
Проанализируем ситуацию: визуально символ в строке выглядит как обычный пробел, однако его Юникод-код отличается от стандартного пробела (код 32). В платформе 1С при преобразовании чисел в строку или при формировании отчетов в качестве разделителя групп разрядов используется неразрывный пробел (в синтаксисе 1С — системная константа Символы.НПП или символ с кодом 160).
Кроме того, при выгрузке или копировании данных из внешних источников (файлы Excel, PDF, JSON/XML, веб-страницы) в строке могут присутствовать другие символы форматирования:
Символы.НПП / Символ(160)).Символы.Таб / Символ(9)).Символы.ПС, Символы.ВК).Поскольку функция СтрЗаменить ищет точное совпадение подстроки, указанный в параметре обычный пробел " " просто не находится в тексте, содержащем неразрывные пробелы.
Рассмотрим базовое и самое распространенное решение. Если задача состоит в том, чтобы очистить строку, полученную после форматирования числа или из стандартных механизмов 1С, необходимо выполнить замену с использованием системной константы Символы.НПП.
Посмотрим на пример кода:
// Удаление неразрывного пробела с использованием системной константы
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");
// Гарантированное удаление как обычных, так и неразрывных пробелов
СтрокаБезПробелов = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, Символы.НПП, ""), " ", "");
Если константа Символы.НПП недоступна в текущем контексте исполнения (например, в некоторых типах внешних соединений), вы можете указать символ по его коду в таблице символов Юникода с помощью функции Символ(160):
// Замена по коду неразрывного пробела
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");
Разберем по шагам альтернативный вариант с разбиением строки на массив фрагментов. Функция СтрРазбить с параметром отсечения пустых строк позволяет удалить все разделители из текста:
// Разбиваем строку по неразрывному пробелу, исключая пустые элементы
МассивФрагментов = СтрРазбить(ИсходнаяСтрока, Символы.НПП, Ложь);
// Собираем строку обратно без разделителей
ОчищеннаяСтрока = СтрСоединить(МассивФрагментов, "");
Если вы работаете на современных версиях платформы 1С:Предприятие (начиная с 8.3.23), наиболее универсальным решением будет применение встроенных функций для работы с регулярными выражениями. Паттерн \s+ покрывает сразу все виды пробельных символов (обычные и неразрывные пробелы, табуляции и переносы строк).
Посмотрим на пример применения:
// Замена всех пробельных символов одной функцией
ОчищеннаяСтрока = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, "\s+", "");
Для более старых версий платформы под управлением ОС Windows аналогичную операцию можно выполнить через COM-объект VBScript.RegExp:
РегЭксп = Новый COMОбъект("VBScript.RegExp");
РегЭксп.Global = Истина;
РегЭксп.Pattern = "\s+";
ОчищеннаяСтрока = РегЭксп.Replace(ИсходнаяСтрока, "");
Важно помнить, что функция Число() чрезвычайно чувствительна к наличию посторонних символов. Если в строке останется хотя бы один неразрывный пробел, платформа вызовет исключение «Преобразование к типу Число не может быть выполнено». Подход с предварительной очисткой строки гарантирует корректное получение числового значения:
// Полный цикл подготовки и преобразования строки в число
СтрокаЧисла = "1 500 000,50"; // Содержит неразрывные пробелы
ПодготовленнаяСтрока = СтрЗаменить(СтрЗаменить(СтрокаЧисла, Символы.НПП, ""), " ", "");
// Преобразуем очищенную строку в числовой тип
ЧисловоеЗначение = Число(ПодготовленнаяСтрока);
Использование правильных символов разделителей и методов их удаления позволяет избежать ошибок при парсинге данных из внешних систем и при преобразовании типов внутри платформы 1С.