Каждый разработчик на платформе 1С:Предприятие рано или поздно сталкивается с загадочным поведением чисел при их преобразовании в строку. Классический пример: у нас есть число 999, мы прибавляем к нему единицу, ожидая получить строковое значение "1000" длиной 4 символа. Однако на практике система возвращает нам строку "1 000", длина которой составляет уже 5 символов. Откуда берется этот лишний пробел и как с ним правильно бороться? Разберем эту проблему детально и найдем наиболее эффективные и профессиональные решения.
Давайте проанализируем, почему платформа 1С ведет себя подобным образом. При неявном или явном преобразовании числа в строку (например, при использовании базовой функции Строка()), система автоматически применяет к числу региональные форматы, установленные в операционной системе или в настройках информационной базы.
Для русской локализации по умолчанию принято разделять группы триад (тысячи, миллионы и т.д.) специальным символом. Важно понимать, что этот символ — не обычный пробел (код ASCII 32), а так называемый неразрывный пробел (НПП), который в таблице Юникода имеет код U+00A0 (в 1С он представлен как Символы.НПП с кодом 160).
Именно из-за этого стандартные функции очистки строк, такие как СокрЛП(), СокрЛ() или СокрП(), оказываются абсолютно бесполезными — они удаляют только классические пробелы и символы табуляции по краям строки, но игнорируют неразрывный пробел внутри текста.
На форумах часто советуют простое решение "в лоб" — использовать функцию замены символов:
// Пример нерекомендуемого кода
СтрокаБезПробелов = СтрЗаменить(Строка(НачНомер1), Символы.НПП, "");
Рассмотрим подробнее, почему этот метод (антипаттерн) крайне нежелательно использовать в промышленной разработке:
",") или точка ("."). В этом случае замена Символы.НПП просто не сработает, в строке останутся разделители, и последующие алгоритмы (например, генерация номеров документов) завершатся ошибкой.Для того чтобы гарантированно и независимо от региональных настроек получить "чистое" числовое представление в виде строки, воспользуемся специализированной системной функцией Формат().
В параметрах форматной строки мы можем явно отключить группировку разрядов с помощью конструктора ЧГ (Группировка). Посмотрим на пример кода:
// Правильное преобразование числа без разделителей разрядов
НачНомер1 = 1000;
СтрокаНомера = Формат(НачНомер1, "ЧГ=0");
// Результат: "1000"
Разберем подробнее, какие варианты написания форматной строки допустимы для отключения группировки:
"ЧГ=0" — явное указание платформе не группировать разряды (рекомендуемый и наиболее понятный вариант)."ЧГ=" — пустой параметр группировки также отключает разделение тысяч пробелами."ЧГ=100" — группировка разрядов каждые 100 символов, что на практике исключает появление пробелов для любых реальных чисел.Существует еще один очень элегантный, быстрый и лаконичный способ преобразования числа в строку без каких-либо пробелов — использование встроенной функции платформы XMLСтрока(). Посмотрим, как это выглядит на практике:
// Преобразование числа через канонический вид XML
СтрокаНомера = XMLСтрока(НачНомер1);
// Результат: "1000"
Данный метод имеет ряд весомых преимуществ:
XMLСтрока() приводит типы к каноническому XML-виду согласно стандартам XML Schema.Формат(), так как платформе не требуется тратить процессорное время на синтаксический анализ форматной строки.В исходном сообщении автора темы на форуме фигурировал самописный алгоритм автоинкремента и дополнения номера лидирующими нулями. В современной разработке на платформе 1С:Предприятие ручное сложение префиксов и "самодельное" вычисление нулей считается нарушением стандартов проектирования.
Если нам необходимо дополнить строку символами (например, нулями слева) до определенной длины, мы должны использовать готовую функцию из состава Библиотеки Стандартных Подсистем (БСП):
// Использование стандартного метода БСП для дополнения строки нулями
НомерСтрокой = XMLСтрока(НачНомер1);
НомерДок = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(НомерСтрокой, Объект.КолСим, "0", "Слева");
Для комплексного управления нумерацией документов, автоматической генерации префиксов организаций, подразделений или узлов распределенных информационных баз (РИБ) настоятельно рекомендуется использовать стандартную подсистему БСП "Префиксация объектов" (функции общего модуля ПрефиксацияОбъектовКлиентСервер).
Применяйте правильные методы форматирования данных, избегайте ловушек неразрывного пробела и пишите качественный код по стандартам 1С!