При разработке в среде 1С программисты часто сталкиваются с ситуацией, когда числовое значение, преобразованное в строку, содержит визуально заметные пробелы между разрядами (например, 15 542). Попытка удалить эти пробелы стандартным вызовом СтрЗаменить(Текст, " ", "") часто не приносит результата. Рассмотрим подробнее, почему это происходит и какими способами можно эффективно решить данную задачу.
Проанализируем ситуацию. В 1С при преобразовании числа в строку (например, через функцию СТРОКА() или при неявном приведении типов) система автоматически форматирует число в соответствии с региональными установками. Для удобства чтения больших чисел платформа вставляет разделитель групп разрядов.
Главный секрет заключается в том, что этот разделитель — не обычный пробел (код символа 32), а неразрывный пробел (символ с кодом 160, в 1С доступен как Символы.НПП). Функция СтрЗаменить ищет точное совпадение символа, и поскольку символ с кодом 32 не идентичен символу с кодом 160, замена не происходит.
Вместо того чтобы сначала создавать строку с "неправильными" символами, а потом пытаться их удалить, мы рекомендуем управлять представлением числа сразу. Самым правильным и надежным способом является использование функции Формат().
Разберем по шагам: параметр ЧГ (Число Группировок) в строке формата отвечает за разделитель разрядов. Если установить его в значение 0, 1С выведет число "сплошным" текстом без каких-либо пробелов.
// Пример правильного преобразования числа в строку без пробелов
ЧислоБезПробелов = Формат(Выборка.СуммаЗаказа, "ЧГ=0");
Важный момент: первым параметром в функцию Формат нужно передавать именно число, а не результат функции СТРОКА(). Если вы передадите уже готовую строку, функция Формат не сможет применить числовые правила форматирования.
Если в вашем распоряжении уже есть строковая переменная и вы не можете вернуться к исходному числу, проанализируем, как правильно выполнить замену. Нужно указать системе, что искать следует именно неразрывный пробел.
// Заменяем неразрывный пробел на пустую строку
Результат = СтрЗаменить(СтроковоеЗначениеЧисла, Символы.НПП, "");
Однако стоит учитывать, что в некоторых случаях (например, при получении данных из внешних систем или веб-сервисов) в строке могут присутствовать оба вида пробелов. В такой ситуации логично применить вложенную замену:
// Удаляем все виды пробелов (обычный и неразрывный)
ЧистаяСтрока = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, Символы.НПП, ""), " ", "");
Рассмотрим альтернативный метод, который часто используют опытные разработчики для передачи данных в технические протоколы (JSON, XML). Функция XMLСтрока() преобразует значение в канонический формат XML.
Для чисел этот формат подразумевает отсутствие разделителей разрядов и использование точки в качестве десятичного разделителя. Это гарантирует отсутствие любых пробелов независимо от региональных настроек сервера или клиента.
// Получение технического строкового представления числа
СтрокаДляОбмена = XMLСтрока(Выборка.СуммаЗаказа);
Иногда встречаются ситуации, когда даже Символы.НПП не помогает. Проанализируем случай, когда данные приходят извне (например, копируются пользователем из веб-браузера). В Unicode существует множество видов пробелов: "узкий неразрывный пробел" (код 8239), "цифровой пробел" (код 8199) или даже "нулевой пробел" (код 8203).
В современных версиях платформы 1С (начиная с 8.3.23) мы можем использовать регулярные выражения. Это позволяет удалить абсолютно все пробельные символы одной командой.
// Удаление всех пробельных символов Unicode с помощью регулярного выражения
РегВыражение = Новый РезультатРегулярногоВыражения(); // Если используем встроенные функции
// Либо через объект RegExp в более ранних версиях:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "\s"; // Шаблон поиска любого пробельного символа
Результат = RegExp.Replace(СтрокаСПробелами, "");
Часто возникает вопрос: можно ли убрать пробелы прямо в запросе? Посмотрим на это критически. Запрос в 1С предназначен для получения данных из базы. Числа в базе данных хранятся в двоичном виде без каких-либо пробелов. Пробелы появляются только в момент представления данных в интерфейсе или при их приведении к типу "Строка" в коде на языке 1С.
Попытки делать сложные манипуляции со строками в запросе (через ПОДСТРОКА или ПРЕДСТАВЛЕНИЕ) излишне нагружают сервер базы данных и делают код трудночитаемым. Лучшей практикой считается получение "чистого" числа из запроса и его последующее форматирование на уровне программного кода с помощью Формат().
Формат(Число, "ЧГ=0"), если вам нужно строковое представление числа без разделителей разрядов. Это самый быстрый и безопасный метод.Символы.НПП.XMLСтрока(), так как она стандартизирует и десятичный разделитель.