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

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

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

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

При загрузке данных из Excel, текстовых файлов или при обмене между системами числа часто приходят в виде строк с пробелами между разрядами: «1 234 567,89». Если передать такое значение напрямую в функцию Число(), 1С либо вернёт 0, либо выдаст ошибку преобразования — и документ или отчёт заполнится некорректными данными. Поэтому задача убрать пробел из числа возникает у разработчиков и внедренцев постоянно.

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

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

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

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

Отдельная ситуация — пробелы в начале и конце строки. Их убирает функция СокрЛП(), но она не трогает пробелы внутри числа. Комбинация «СокрЛП + замена внутренних пробелов» покрывает большинство реальных случаев.

Способ 1: СтрЗаменить для обычного и неразрывного пробела

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

СтрокаЧисла = "1 234 567,89";

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), "");

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");

Результат = Число(СтрокаЧисла); // 1234567,89

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

Способ 2: функция Число() с обработкой ошибок

Даже после очистки строки преобразование может не сработать: вместо запятой встречается точка, в данных попадаются пустые строки или текст вроде «н/д». Безопасный шаблон — обернуть вызов Число() в конструкцию Попытка/Исключение и задать поведение при ошибке.

Попытка

Результат = Число(СтрЗаменить(СтрЗаменить(СтрокаЧисла, Символ(160), ""), " ", ""));

Исключение

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

// Запись в журнал регистрации или протокол загрузки

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

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

1c
Функция СтрокаВЧисло(Знач Строка)
    Строка = СтрЗаменить(Строка, Символ(160), "");
    Строка = СтрЗаменить(Строка, " ", "");
    Строка = СтрЗаменить(Строка, ".", ",");
    Попытка
        Возврат Число(СокрЛП(Строка));
    Исключение
        Возврат 0;
    КонецПопытки;
КонецФункции

Способ 3: очистка строки от всех лишних символов

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

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

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

Сравнение вариантов

СтрЗаменить по двум пробелам

Быстро и просто; подходит, когда формат входных данных известен и стабилен

Число() в Попытка/Исключение

Обязательное дополнение к любому способу; защищает от падения кода на неожиданных данных

Фильтрация допустимых символов

Для непредсказуемых источников (Excel, веб, ручной ввод); медленнее и требует проверки результата

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

Обратная задача встречается не реже: число хранится корректно, но при выводе в табличный документ, печатную форму или строку сообщения 1С добавляет группировку разрядов — «1 234 567». Чтобы вывести число без пробелов, используйте функцию Формат() с параметром, отключающим группировку.

СтрокаБезПробелов = Формат(Сумма, "ЧГ=0");

Параметр ЧГ=0 отключает разделение групп разрядов. Дополнительно можно указать число знаков дробной части, например Формат(Сумма, "ЧГ=0; ЧДЦ=2") выведет «1234567,89». Этот же приём работает в форматных строках макетов и при заполнении параметров табличного документа.

Если пробелы появляются в ячейке Excel после выгрузки из 1С, причина та же — число выгружено как отформатированная строка, а не как число. Проверьте, что в ячейку записывается значение числового типа, а не результат Формат() с группировкой.

Частые ошибки и как их избежать

Самая распространённая ошибка — замена только обычного пробела. Код выглядит рабочим, на тестовых данных «1 000» всё срабатывает, но в реальной выгрузке из Excel стоит неразрывный пробел, и преобразование падает. Всегда обрабатывайте оба символа: Символ(160) и обычный пробел.

Вторая ошибка — путаница с разделителем дробной части. Функция Число() ожидает разделитель в соответствии с региональными настройками сеанса. Если файл пришёл с точкой, а сеанс настроен на запятую (или наоборот), результат будет неверным: «1234.56» может превратиться в 123456. Перед преобразованием приведите разделитель к одному виду.

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

Типичные ошибки
01
Замена только обычного пробела — неразрывный пробел (код 160) остаётся, и Число() выдаёт ошибку
02
Игнорирование разделителя дробной части — точка вместо запятой искажает значение в разы
03
Подстановка 0 при ошибке в суммовых полях — учётные данные тихо искажаются без сигнала пользователю
04
Выгрузка в Excel отформатированной строкой вместо числа — в файле снова появляются пробелы и фильтры не работают

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

После преобразования убедитесь, что значение действительно числовое и корректное. Простая проверка — функция ТипЗнч(): она должна вернуть тип «Число». Дополнительно сравните контрольные суммы: если загружали тысячу строк, сумма по колонке до и после загрузки должна совпасть с источником.

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

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

Тип значения после преобразования
Норма

ТипЗнч() возвращает «Число», значение участвует в арифметике

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

Тип «Строка» — дальнейшие сравнения и суммирование дадут неверный результат

Значение на контрольном примере
Норма

«1 234,56» превратилось в 1234,56

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

Получилось 0, 123456 или ошибка преобразования

Итог по загруженным данным
Норма

Сумма совпадает с источником

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

Расхождение — часть строк не преобразовалась или исказилась

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

Итог

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

Пробелы в числах — чаще всего неразрывный символ 160, поэтому заменяйте оба типа пробелов через СтрЗаменить. Преобразование в число всегда оборачивайте в Попытка/Исключение, а при выводе без пробелов используйте Формат(Значение, "ЧГ=0"). Проверяйте результат по типу значения и контрольной сумме.

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

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

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

Число() возвращает 0 без ошибки — это нормально?

Функция Число() при невозможности преобразования в ряде контекстов возвращает 0, а в других генерирует исключение. Полагаться на 0 опасно: для суммовых полей это молчаливое искажение данных. Явно проверяйте исходную строку и логируйте проблемные значения.

Как узнать, какой именно пробел в строке?

Пройдите по строке циклом и выведите код каждого символа через КодСимвола(Сред(Строка, Позиция, 1)). Обычный пробел имеет код 32, неразрывный — 160, табуляция — 9.

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

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

Почему после выгрузки в Excel числа стали текстом с пробелами?

Потому что в файл записано отформатированное строковое представление, а не числовое значение. Записывайте в ячейку значение типа Число или используйте Формат(Значение, "ЧГ=0") — тогда Excel распознает значение как число.

Работает ли СтрЗаменить с табуляцией и переносами строк?

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