Разработка и Конфигурация · 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 и сайтов прямо в поля документов. Если поле строковое (например, комментарий или реквизит для временного хранения), пробелы сохраняются как есть и мешают последующей обработке.
Вводится с клавиатуры, удаляется заменой СтрЗаменить(Строка, " ", "")
Ставит 1С и Excel при группировке разрядов; удаляется через Символ(160)
Встречается при выгрузках из текстовых файлов; удаляется через Символы.Таб
Удаление пробелов функцией СтрЗаменить
Универсальный способ — последовательно заменить все виды пробельных символов на пустую строку. Базовый вариант для обычного пробела:
СтрокаЧисла = "1 234 567,89";
ЧистаяСтрока = СтрЗаменить(СтрокаЧисла, " ", "");
Результат = Число(ЧистаяСтрока); // 1234567,89
Но этого недостаточно, если в строке неразрывный пробел. Визуально он неотличим от обычного, поэтому код «вроде бы правильный», а преобразование всё равно падает. Надёжный вариант — убирать оба символа:
Функция УбратьПробелыИзЧисла(Знач СтрокаЧисла)
Результат = СтрЗаменить(СтрокаЧисла, " ", "");
Результат = СтрЗаменить(Результат, Символ(160), "");
Результат = СтрЗаменить(Результат, Символы.Таб, "");
Возврат Результат;
КонецФункции
Обратите внимание: неразрывный пробел задаётся через Символ(160), а не через вставку символа в исходный код. Символ, скопированный в текст модуля, легко потерять при редактировании, и отладка превратится в поиск невидимой ошибки.
СтрокаБезПробелов = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, " ", ""), Символ(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»), фильтр склеит все цифры в одно число. Для таких случаев сначала разбивайте строку по структуре данных, а потом очищайте каждое поле отдельно.
Проверка результата и граничные случаи
После очистки убедитесь, что результат соответствует ожиданиям. Минимальная проверка — сравнить сумму загруженных значений с контрольной суммой из источника (итог по колонке Excel, итоговая строка выписки). Расхождение означает, что часть строк обработана неверно.
Отдельно проверьте граничные случаи: пустые строки (Число("") вернёт ошибку — подставляйте 0), отрицательные значения со знаком минус (фильтр «только цифры» его удалит), числа в экспоненциальной записи из Excel («1,5E+06») и значения с разным числом десятичных знаков.
Как проверить результат
Совпадает с контрольной суммой источника
Расходится — ищите строки, где очистка исказила значение
Выполняется без исключений для всех строк
Ошибка на части строк — остались нестандартные символы
Число записано без разделителей разрядов
В файле «1 234 567» — форматная строка не отключает группировку
Знак минус сохранён после обработки
Знак потерян — фильтр символов слишком агрессивный
Выбор подхода под задачу
Если пробелы появляются при вашем собственном выводе данных — правильнее настроить формат (ЧГ=0), а не чистить строку потом. Если данные приходят извне в непредсказуемом виде — нужна функция очистки с заменой всех пробельных символов и обработкой исключений. Для разовой загрузки достаточно простой замены, для регулярного обмена — полноценной функции с журналированием ошибочных строк.
Как выбрать действие
Что важно запомнить
Пробелы в числах 1С — это чаще всего неразрывные пробелы (Символ(160)) от группировки разрядов. Удаляйте оба типа пробелов через СтрЗаменить, преобразование делайте через Число() с обработкой ошибок, а при собственном выводе отключайте группировку параметром ЧГ=0 в форматной строке. Массовую загрузку всегда проверяйте сверкой итоговых сумм.
Частые вопросы
Почему СтрЗаменить со строкой " " не удаляет пробел из числа?
Потому что в числе, отформатированном 1С или Excel, стоит неразрывный пробел с кодом 160, а не обычный с кодом 32. Они визуально одинаковы, но для функции замены это разные символы. Добавьте вторую замену: СтрЗаменить(Строка, Символ(160), "").
Как узнать, какой именно символ стоит внутри строки?
Используйте функцию КодСимвола(Строка, Позиция) в отладчике или выведите коды всех символов циклом. Обычный пробел даст 32, неразрывный — 160, табуляция — 9. Так вы точно поймёте, что нужно заменять.
Можно ли убрать пробелы из числа без программирования?
Если речь о выводе в отчёт или печатную форму — да: в свойствах поля откройте конструктор форматной строки и снимите флажок группировки разрядов. Если данные уже лежат в строковом реквизите базы, без обработки на встроенном языке не обойтись.
Число() выдаёт ошибку даже после удаления пробелов. Что ещё проверить?
Чаще всего мешают: знак валюты, буква «р» в «руб.», двойная запятая или точка, минус нестандартного вида (длинное тире вместо дефиса). Выведите коды символов проблемной строки — так видно любой невидимый символ.
Как выгрузить числа в CSV без пробелов и в нужном формате?
При формировании строки файла используйте Формат(Значение, "ЧГ=0; ЧРД=."), где ЧГ=0 отключает группировку, а ЧРД задаёт десятичный разделитель. Не используйте Строка() — она применит настройки текущей локали и добавит разделители разрядов.
Опасно ли менять данные обработкой прямо в рабочей базе?
Да, если обработка записывает изменённые значения в документы или регистры. Ошибка в логике очистки (например, удалённый десятичный разделитель) исказит суммы во всех затронутых объектах. Сначала запустите обработку на копии базы и сверьте итоги, а в рабочей базе перед запуском сделайте резервную копию.