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

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

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

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

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

Задача решается несколькими способами: простой заменой символов через СтрЗаменить(), настройкой форматирования, чтобы пробелы не появлялись вообще, или аккуратным парсингом строки с учётом разных типов пробелов. Выбор зависит от того, откуда пришли данные и что с ними нужно сделать дальше — вывести в отчёт, загрузить в документ или передать по API.

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

Откуда в числах берутся пробелы

Пробелы внутри числа появляются по трём основным причинам. Первая — автоматическое форматирование: когда 1С выводит число в отчёт, табличный документ или преобразует его в строку, по умолчанию включается группировка разрядов. Число 1234567 превращается в «1 234 567», и разделителем служит неразрывный пробел (код символа 160), а не обычный (код 32).

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

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

Код 32Обычный пробел

Вводится с клавиатуры, удаляется заменой СтрЗаменить(Строка, " ", "")

Код 160Неразрывный пробел

Ставит 1С и Excel при группировке разрядов; удаляется через Символ(160)

Код 9Табуляция

Встречается при выгрузках из текстовых файлов; удаляется через Символы.Таб

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

Универсальный способ — последовательно заменить все виды пробельных символов на пустую строку. Базовый вариант для обычного пробела:

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

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

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

Но этого недостаточно, если в строке неразрывный пробел. Визуально он неотличим от обычного, поэтому код «вроде бы правильный», а преобразование всё равно падает. Надёжный вариант — убирать оба символа:

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

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

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

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

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

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

Обратите внимание: неразрывный пробел задаётся через Символ(160), а не через вставку символа в исходный код. Символ, скопированный в текст модуля, легко потерять при редактировании, и отладка превратится в поиск невидимой ошибки.

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

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

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

Параметр ЧГ (число группировки) в форматной строке отвечает за разделение разрядов. Значение 0 отключает группировку:

Сумма = 1234567.89;

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

СтрокаСПробелами = Строка(Сумма); // "1 234 567,89"

Аналогично работает конструктор форматной строки в свойствах поля табличного документа: снимите флажок «Группировка» или укажите ЧГ=0 вручную. Это правильный подход для выгрузок в CSV и обменов, где принимающая система ждёт «чистое» число.

Безопасное преобразование строки в число

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

Функция СтрокаВЧисло(Знач СтрокаЧисла)

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

Очищенная = СтрЗаменить(Очищенная, Символ(160), "");

Очищенная = СтрЗаменить(Очищенная, ",", ".");

Попытка

Возврат Число(Очищенная);

Исключение

Возврат 0;

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

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

Замена запятой на точку нужна, когда данные приходят из источников с английской локалью, а обработка идёт в русской — или наоборот. Но будьте осторожны: в некоторых форматах запятая является разделителем тысяч («1,234.56»), и слепая замена исказит значение. Перед массовой загрузкой проверьте несколько реальных строк из файла.

Загрузка чисел из Excel и табличных документов

При чтении Excel через COM-объект или через табличный документ 1С поведение различается. Если ячейка имеет числовой формат, метод чтения значения вернёт число — и никаких пробелов не будет. Проблемы начинаются, когда ячейка текстовая или значение читается как отображаемый текст.

Типовой сценарий загрузки прайса: колонка с ценой прочитана как строка «12 500 руб.». Здесь одной замены пробелов мало — нужно убрать и обозначение валюты. Практичный подход — оставить в строке только цифры и допустимые разделители:

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

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Этот способ устойчив к любым «мусорным» символам, но требует контроля: если в исходной строке была и цена, и количество («12 шт по 1 500»), фильтр склеит все цифры в одно число. Для таких случаев сначала разбивайте строку по структуре данных, а потом очищайте каждое поле отдельно.

Типичные ошибки
01
Замена только обычного пробела — неразрывный пробел (Символ(160)) остаётся, и Число() выдаёт ошибку
02
Вставка неразрывного пробела прямо в код модуля — символ невидим и теряется при копировании кода
03
Слепая замена запятой на точку — в формате «1,234.56» это искажает значение
04
Использование Строка() для выгрузки — число снова получает разделители разрядов
05
Отсутствие обработки исключений — одна «битая» строка останавливает всю загрузку файла

Проверка результата и граничные случаи

После очистки убедитесь, что результат соответствует ожиданиям. Минимальная проверка — сравнить сумму загруженных значений с контрольной суммой из источника (итог по колонке Excel, итоговая строка выписки). Расхождение означает, что часть строк обработана неверно.

Отдельно проверьте граничные случаи: пустые строки (Число("") вернёт ошибку — подставляйте 0), отрицательные значения со знаком минус (фильтр «только цифры» его удалит), числа в экспоненциальной записи из Excel («1,5E+06») и значения с разным числом десятичных знаков.

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

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

Итоговая сумма после загрузки
Норма

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

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

Расходится — ищите строки, где очистка исказила значение

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

Выполняется без исключений для всех строк

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

Ошибка на части строк — остались нестандартные символы

Выгрузка числа в файл
Норма

Число записано без разделителей разрядов

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

В файле «1 234 567» — форматная строка не отключает группировку

Отрицательные суммы
Норма

Знак минус сохранён после обработки

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

Знак потерян — фильтр символов слишком агрессивный

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

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

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

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

Число преобразуется в строку в вашем кодеИспользуйте Формат(Число, "ЧГ=0") — пробелы не появятся вовсе
Строка пришла из Excel или файла и содержит пробелыОчистите через СтрЗаменить по обычному и неразрывному пробелу, затем Число()
В строке кроме пробелов есть буквы и знаки валютПримените фильтр допустимых символов, оставив цифры и разделитель
Загрузка массовая и качество данных неизвестноОберните преобразование в Попытка/Исключение и собирайте список ошибочных строк
Итог

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

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

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

Почему СтрЗаменить со строкой " " не удаляет пробел из числа?

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

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

Используйте функцию КодСимвола(Строка, Позиция) в отладчике или выведите коды всех символов циклом. Обычный пробел даст 32, неразрывный — 160, табуляция — 9. Так вы точно поймёте, что нужно заменять.

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

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

Число() выдаёт ошибку даже после удаления пробелов. Что ещё проверить?

Чаще всего мешают: знак валюты, буква «р» в «руб.», двойная запятая или точка, минус нестандартного вида (длинное тире вместо дефиса). Выведите коды символов проблемной строки — так видно любой невидимый символ.

Как выгрузить числа в CSV без пробелов и в нужном формате?

При формировании строки файла используйте Формат(Значение, "ЧГ=0; ЧРД=."), где ЧГ=0 отключает группировку, а ЧРД задаёт десятичный разделитель. Не используйте Строка() — она применит настройки текущей локали и добавит разделители разрядов.

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

Да, если обработка записывает изменённые значения в документы или регистры. Ошибка в логике очистки (например, удалённый десятичный разделитель) исказит суммы во всех затронутых объектах. Сначала запустите обработку на копии базы и сверьте итоги, а в рабочей базе перед запуском сделайте резервную копию.