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

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

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

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

Выясняем причину: что это за пробел?

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

В качестве разделителя триад (групп разрядов) платформа по умолчанию использует так называемый неразрывный пробел (НПП). В стандартной кодировке Windows-1251 и Unicode этот символ имеет десятичный код 160 (или шестнадцатеричный код 0xA0). Поскольку функция СтрЗаменить(Переменная, " ", "") пытается найти стандартный пробел с кодом 32, она просто "не видит" неразрывный пробел и оставляет строку без изменений. Именно поэтому прямая замена в переменной не дает результата.

Ниже мы рассмотрим четыре эффективных способа борьбы с этой проблемой, начиная с самых надежных и заканчивая системными настройками.

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

Самый правильный и надежный способ преобразовать число в строку без лишних разделителей — использовать встроенную функцию платформы Формат(). Этот подход позволяет управлять представлением числа на этапе его формирования, гарантируя стабильную работу кода независимо от настроек конкретного компьютера или версии платформы.

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


ЧисловоеЗначение = 1010;
СтроковоеЗначение = Формат(ЧисловоеЗначение, "ЧГ=0");
// Результат: "1010"

Разберем подробнее, что означает параметр "ЧГ=0" в форматной строке:

  1. Конструкция ЧГ отвечает за параметр "Число: Группировка".
  2. Значение 0 явно указывает платформе на то, что группировку разрядов производить не нужно. Число будет выведено сплошным набором цифр.

В зависимости от конфигурации или стандартов кодирования в вашей компании вы также можете встретить альтернативные варианты записи этого параметра:

Решение 2. Использование функции XMLСтрока() для технических нужд

Если вам необходимо преобразовать число в строковый формат для сугубо технических целей — например, для передачи в API сторонних сервисов, формирования уникальных идентификаторов, генерации путей к файлам на диске или выгрузки данных в форматы XML/JSON — идеальным решением станет функция XMLСтрока().

Посмотрим на пример использования:


КодТовара = 1234567;
ТехническаяСтрока = XMLСтрока(КодТовара);
// Результат: "1234567"

Преимущества и особенности данного метода:

Решение 3. Точечное удаление неразрывного пробела через СтрЗаменить()

Бывают ситуации, когда вы получаете готовую строку с числами из внешнего источника (например, при парсинге текстовых файлов или веб-страниц) и вам необходимо вручную очистить ее от разделителей триад. В этом случае мы можем применить функцию СтрЗаменить(), но передав ей системный параметр неразрывного пробела.

Для обращения к неразрывному пробелу в платформе предусмотрена глобальная системная константа Символы.НПП. Рассмотрим пример:


ИсходнаяСтрока = "1 234 567"; // Содержит неразрывные пробелы
ОчищеннаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");
// Результат: "1234567"

Если вы работаете в специфическом окружении или контексте, где обращение к Символы.НПП по какой-то причине ограничено, вы можете получить этот символ по его кодовой таблице с помощью функции Символ():


ИсходнаяСтрока = "1 234 567";
РазделительТриад = Символ(160); // Код неразрывного пробела
ОчищеннаяСтрока = СтрЗаменить(ИсходнаяСтрока, РазделительТриад, "");
// Результат: "1234567"

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

Решение 4. Глобальное отключение группировки в Конфигураторе

Если специфика учета вашей информационной базы требует, чтобы числа вообще никогда автоматически не разделялись на группы разрядов при выводе пользователю, такое поведение можно настроить централизованно для всей базы данных.

Выполним следующие шаги в Конфигураторе:

  1. Откройте вашу информационную базу в режиме Конфигуратор.
  2. В главном верхнем меню перейдите по пути: Администрирование -> Региональные установки ИБ.
  3. В открывшемся диалоговом окне найдите поле Группировка.
  4. Установите значение этого поля равным 0.
  5. Нажмите кнопку ОК и примените изменения.

После этого платформа 1С:Предприятие перестанет использовать неразрывные пробелы при неявном преобразовании чисел во всей базе данных.

Остерегайтесь неявного преобразования типов!

Проанализируем неочевидную ошибку, на которую часто натыкаются разработчики. Проблема появления неразрывных пробелов может возникнуть "тихо" в процессе сложения строк и чисел (конкатенации). Рассмотрим следующий пример кода:


НомерДоговора = 10550;
ИмяКаталога = "Договор_" + НомерДоговора;
// В результате имя папки на диске может стать: "Договор_10 550"

Поскольку левый операнд является строкой, платформа автоматически пытается неявно привести числовую переменную НомерДоговора к типу Строка. При этом применяется стандартное форматирование по умолчанию с добавлением неразрывного пробела. На жестком диске или в сетевой папке будет создан каталог с пробелом в имени, что впоследствии приведет к сбоям при обращении к путям.

Чтобы избежать подобных трудночитаемых багов, всегда преобразуйте типы явно в тех местах, где требуется точное строковое представление чисел:


НомерДоговора = 10550;
ИмяКаталога = "Договор_" + Формат(НомерДоговора, "ЧГ=0");
// Гарантированный результат: "Договор_10550"

Мы подробно разобрали причины возникновения разделителей в числовых строках и изучили все доступные методы их устранения. Используйте функцию Формат() для вывода данных на формы и в отчеты, а XMLСтрока() — для технических файлов обмена и сетевой интеграции. Это сделает ваш код чистым, отказоустойчивым и профессиональным!

← На главную