Как убрать неразрывный пробел при преобразовании числа в строку в 1С?

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

Каждый разработчик на платформе 1С:Предприятие рано или поздно сталкивается с загадочным поведением чисел при их преобразовании в строку. Классический пример: у нас есть число 999, мы прибавляем к нему единицу, ожидая получить строковое значение "1000" длиной 4 символа. Однако на практике система возвращает нам строку "1 000", длина которой составляет уже 5 символов. Откуда берется этот лишний пробел и как с ним правильно бороться? Разберем эту проблему детально и найдем наиболее эффективные и профессиональные решения.

Выясняем причину: физика процесса и неразрывный пробел

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

Для русской локализации по умолчанию принято разделять группы триад (тысячи, миллионы и т.д.) специальным символом. Важно понимать, что этот символ — не обычный пробел (код ASCII 32), а так называемый неразрывный пробел (НПП), который в таблице Юникода имеет код U+00A0 (в 1С он представлен как Символы.НПП с кодом 160).

Именно из-за этого стандартные функции очистки строк, такие как СокрЛП(), СокрЛ() или СокрП(), оказываются абсолютно бесполезными — они удаляют только классические пробелы и символы табуляции по краям строки, но игнорируют неразрывный пробел внутри текста.

Почему замена через СтрЗаменить() — это плохой тон?

На форумах часто советуют простое решение "в лоб" — использовать функцию замены символов:


// Пример нерекомендуемого кода
СтрокаБезПробелов = СтрЗаменить(Строка(НачНомер1), Символы.НПП, "");

Рассмотрим подробнее, почему этот метод (антипаттерн) крайне нежелательно использовать в промышленной разработке:

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

Решение 1. Использование функции Формат() — стандартный надежный способ

Для того чтобы гарантированно и независимо от региональных настроек получить "чистое" числовое представление в виде строки, воспользуемся специализированной системной функцией Формат().

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


// Правильное преобразование числа без разделителей разрядов
НачНомер1 = 1000;
СтрокаНомера = Формат(НачНомер1, "ЧГ=0"); 
// Результат: "1000"

Разберем подробнее, какие варианты написания форматной строки допустимы для отключения группировки:

Решение 2. Быстрый метод с использованием XMLСтрока()

Существует еще один очень элегантный, быстрый и лаконичный способ преобразования числа в строку без каких-либо пробелов — использование встроенной функции платформы XMLСтрока(). Посмотрим, как это выглядит на практике:


// Преобразование числа через канонический вид XML
СтрокаНомера = XMLСтрока(НачНомер1);
// Результат: "1000"

Данный метод имеет ряд весомых преимуществ:

Как правильно формировать номера документов по стандартам БСП

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

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


// Использование стандартного метода БСП для дополнения строки нулями
НомерСтрокой = XMLСтрока(НачНомер1);
НомерДок = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(НомерСтрокой, Объект.КолСим, "0", "Слева");

Для комплексного управления нумерацией документов, автоматической генерации префиксов организаций, подразделений или узлов распределенных информационных баз (РИБ) настоятельно рекомендуется использовать стандартную подсистему БСП "Префиксация объектов" (функции общего модуля ПрефиксацияОбъектовКлиентСервер).

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

← На главную