К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как убрать пробелы в цифрах в 1С

Как убрать пробелы в цифрах в 1С: СтрЗаменить, СокрЛП, неразрывные пробелы, преобразование строки в число. Примеры кода и типичные ошибки.

Пробелы в числах появляются в 1С постоянно: при форматировании сумм с разделителями групп («1 250 000»), при загрузке данных из Excel или банковских выписок, при обмене с внешними системами. Пока значение хранится как строка, пробелы не мешают отображению, но любая попытка преобразовать такую строку в число, сложить значения или выгрузить их дальше приводит к ошибке или к неверному результату.

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

Ниже разобраны рабочие способы: от простой замены символов до функции полной очистки строки, а также особенности преобразования очищенной строки в число и типичные ошибки, из-за которых «вроде правильный» код не работает.

Почему в цифрах появляются пробелы

Самый частый источник — форматирование чисел при выводе. Когда число преобразуется в строку с разделителем групп разрядов, платформа вставляет между тысячами неразрывный пробел. Визуально «1 250 000» выглядит аккуратно, но обратное преобразование такой строки в число стандартной функцией Число() завершится ошибкой преобразования.

Второй источник — внешние данные. Файлы Excel, CSV, банковские выписки, данные с сайтов и из буфера обмена часто содержат числа, отформатированные с пробелами-разделителями. При загрузке такие значения попадают в строковые реквизиты, и дальнейшая обработка требует предварительной очистки.

Третий случай — ручной ввод. Пользователи копируют суммы из документов, писем, калькуляторов и вставляют их в поля вместе с пробелами. Если поле строковое, значение сохранится как есть и «выстрелит» позже — при расчёте, обмене или формировании отчёта.

Быстрое удаление пробелов функцией СтрЗаменить

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

Минимальный пример для обычного пробела:

СтрокаСуммы = "1 250 000,50";

СтрокаБезПробелов = СтрЗаменить(СтрокаСуммы, " ", "");

// Результат: "1250000,50"

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

СтрокаБезПробелов = СтрЗаменить(СтрокаСуммы, " ", "");

СтрокаБезПробелов = СтрЗаменить(СтрокаБезПробелов, Символ(160), "");

Вместо Символ(160) можно использовать предопределённое значение Символы.НПП — это читаемее и снижает риск ошибиться в коде символа.

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

Универсальная функция очистки строки от всех невидимых символов

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

Функция УбратьПробелыИзЧисла(Знач СтрокаЧисла) Экспорт

Результат = СтрокаЧисла;

Результат = СтрЗаменить(Результат, " ", "");

Результат = СтрЗаменить(Результат, Символы.НПП, "");

Результат = СтрЗаменить(Результат, Символы.Таб, "");

Результат = СтрЗаменить(Результат, Символы.ПС, "");

Результат = СтрЗаменить(Результат, Символы.ВК, "");

Возврат СокрЛП(Результат);

КонецФункции

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

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

Функция ОставитьТолькоЦифры(Знач СтрокаЧисла)

Результат = "";

Допустимые = "0123456789.,";

Для Позиция = 1 По СтрДлина(СтрокаЧисла) Цикл

Символ = Сред(СтрокаЧисла, Позиция, 1);

Если СтрНайти(Допустимые, Символ) > 0 Тогда

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции

Преобразование очищенной строки в число

После удаления пробелов строку нужно превратить в число. Здесь есть два подводных камня: разделитель дробной части и обработка ошибок.

Функция Число() ожидает точку в качестве разделителя дробной части. Если в исходных данных запятая («1250000,50»), преобразование завершится ошибкой. Поэтому перед вызовом Число() запятую заменяют на точку:

СтрокаБезПробелов = УбратьПробелыИзЧисла(СтрокаСуммы);

СтрокаБезПробелов = СтрЗаменить(СтрокаБезПробелов, ",", ".");

Попытка

Сумма = Число(СтрокаБезПробелов);

Исключение

Сумма = 0;

// Зафиксировать проблемное значение в журнале

КонецПопытки;

Обёртка в Попытка...Исключение обязательна при массовой загрузке: одна «битая» строка не должна обрывать обработку всего файла. При этом молча подставлять ноль без записи в журнал — плохая практика: ошибки в данных останутся незамеченными, а итоги будут неверными.

Как не допустить пробелы при выводе чисел

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

Используйте функцию Формат() с параметром ЧГ=0 (отключение группировки разрядов):

СтрокаДляВыгрузки = Формат(Сумма, "ЧГ=0");

// "1250000.5" вместо "1 250 000,5"

Аналогично в форматной строке для полей формы, печатных форм и схем компоновки данных: параметр ЧГ=0 убирает разделители групп. Это важно для машиночитаемых выгрузок (XML, CSV, обмен с банками), где пробелы-разделители недопустимы.

Выбор способа под задачу

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

Маршрут решения

Как выбрать действие

Нужно быстро очистить одно значение в кодеИспользуйте вложенный СтрЗаменить с обычным пробелом и Символы.НПП
Загружаете файлы из разных источниковНапишите общую функцию очистки с удалением всех пробельных символов и обработкой ошибок
Готовите строку для выгрузки или обменаНе очищайте, а форматируйте число сразу с параметром ЧГ=0
В данных встречаются буквы и знаки валютПрименяйте посимвольную фильтрацию, оставляя только цифры и разделитель

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

Контрольные точки

Как проверить результат

Строка после очистки
Норма

Содержит только цифры и один разделитель дробной части

Тревожный признак

Остались пробелы, буквы или несколько точек

Число() после преобразования
Норма

Возвращает ожидаемое значение без исключения

Тревожный признак

Ошибка преобразования или ноль вместо реальной суммы

Итоговая сумма по загруженному файлу
Норма

Совпадает с контрольной суммой источника

Тревожный признак

Расхождение — ищите строки, попавшие в журнал ошибок

Типичные ошибки при удалении пробелов

Первая и самая массовая ошибка — удаление только обычного пробела. Строка «1 250 000» с неразрывными пробелами после СтрЗаменить(С, " ", "") останется неизменной, и разработчик долго ищет причину, хотя визуально пробелы «на месте».

Вторая ошибка — использование СокрЛП() вместо замены. Функция обрезает пробелы только по краям строки, а разделители разрядов находятся внутри. Результат выглядит очищенным, но в число не преобразуется.

Третья ошибка — игнорирование разделителя дробной части. Даже идеально очищенная строка «1250000,50» с запятой не пройдёт через Число() без предварительной замены на точку.

Типичные ошибки
01
Удаление только обычного пробела — неразрывный (Символы.НПП) остаётся, и преобразование падает
02
Использование СокрЛП вместо СтрЗаменить — пробелы внутри строки не удаляются
03
Число() без замены запятой на точку — ошибка преобразования на данных с запятой
04
Молчаливая подстановка нуля в Исключении — ошибки данных скрываются, итоги искажаются

Частые вопросы

Чем неразрывный пробел отличается от обычного в 1С?

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

Почему Число() выдаёт ошибку, хотя пробелы удалены?

Чаще всего причина в разделителе дробной части: функция Число() принимает только точку. Если в строке запятая, замените её: СтрЗаменить(Строка, ",", "."). Также проверьте, не осталось ли в строке букв, знака валюты или двух разделителей.

Можно ли убрать пробелы без программирования?

В типовых механизмах загрузки (например, при чтении табличных документов) настроек автоматической очистки обычно нет. В самом Excel перед загрузкой можно использовать «Найти и заменить», удалив пробелы в исходном файле. Но для регулярных загрузок надёжнее один раз написать функцию очистки в обработке.

Как вывести число в строку без пробелов-разделителей?

Используйте Формат(Число, "ЧГ=0"). Параметр ЧГ=0 отключает группировку разрядов, и неразрывные пробелы не появляются. Это стандартный способ подготовки чисел для XML-выгрузок, CSV и обмена с внешними системами.

Удалит ли СокрЛП пробелы внутри числа?

Нет. СокрЛП() обрезает пробельные символы только в начале и в конце строки. Разделители разрядов находятся в середине, поэтому для их удаления нужна СтрЗаменить(). СокрЛП полезен как финальный штрих после замен, но не как основное средство.

Что делать, если после очистки часть строк всё равно не преобразуется?

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

Итог

Что важно запомнить

Удаляйте оба вида пробелов — обычный и неразрывный (Символы.НПП), заменяйте запятую на точку перед Число() и оборачивайте преобразование в Попытка...Исключение с записью ошибок. Для выгрузок форматируйте числа сразу с ЧГ=0, чтобы пробелы не появлялись вовсе.