Разработка и Конфигурация · 10 мин
Как убрать пробелы в цифрах в 1С
Как убрать пробелы в цифрах в 1С: СтрЗаменить, СокрЛП, неразрывные пробелы, преобразование строки в число. Примеры кода и типичные ошибки.
Пробелы в числах появляются в 1С постоянно: при форматировании сумм с разделителями групп («1 250 000»), при загрузке данных из Excel или банковских выписок, при обмене с внешними системами. Пока значение хранится как строка, пробелы не мешают отображению, но любая попытка преобразовать такую строку в число, сложить значения или выгрузить их дальше приводит к ошибке или к неверному результату.
Главная сложность в том, что «пробел» в 1С — это не один символ. Помимо обычного пробела (код 32) встречаются неразрывный пробел (код 160), который платформа сама вставляет при форматировании чисел, а также табуляции и другие невидимые символы из внешних источников. Универсальная очистка должна учитывать все эти варианты, иначе часть данных останется «битой».
Ниже разобраны рабочие способы: от простой замены символов до функции полной очистки строки, а также особенности преобразования очищенной строки в число и типичные ошибки, из-за которых «вроде правильный» код не работает.
Почему в цифрах появляются пробелы
Самый частый источник — форматирование чисел при выводе. Когда число преобразуется в строку с разделителем групп разрядов, платформа вставляет между тысячами неразрывный пробел. Визуально «1 250 000» выглядит аккуратно, но обратное преобразование такой строки в число стандартной функцией Число() завершится ошибкой преобразования.
Второй источник — внешние данные. Файлы Excel, CSV, банковские выписки, данные с сайтов и из буфера обмена часто содержат числа, отформатированные с пробелами-разделителями. При загрузке такие значения попадают в строковые реквизиты, и дальнейшая обработка требует предварительной очистки.
Третий случай — ручной ввод. Пользователи копируют суммы из документов, писем, калькуляторов и вставляют их в поля вместе с пробелами. Если поле строковое, значение сохранится как есть и «выстрелит» позже — при расчёте, обмене или формировании отчёта.
Быстрое удаление пробелов функцией СтрЗаменить
Основной инструмент — функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Она заменяет все вхождения указанного символа, поэтому подходит для удаления пробелов по всей строке, а не только по краям.
Минимальный пример для обычного пробела:
СтрокаСуммы = "1 250 000,50";
СтрокаБезПробелов = СтрЗаменить(СтрокаСуммы, " ", "");
// Результат: "1250000,50"
Однако этого недостаточно, если в строке неразрывные пробелы. Их нужно удалять отдельной заменой:
СтрокаБезПробелов = СтрЗаменить(СтрокаСуммы, " ", "");
СтрокаБезПробелов = СтрЗаменить(СтрокаБезПробелов, Символ(160), "");
Вместо Символ(160) можно использовать предопределённое значение Символы.НПП — это читаемее и снижает риск ошибиться в коде символа.
СтрокаБезПробелов = СтрЗаменить(СтрЗаменить(СтрокаСуммы, " ", ""), Символы.НПП, "");Универсальная функция очистки строки от всех невидимых символов
Когда данные приходят из разных источников, надёжнее написать одну функцию, которая удаляет все виды пробельных символов разом: обычный пробел, неразрывный пробел, табуляцию, переводы строк. Такую функцию удобно разместить в общем модуле и вызывать из любой обработки.
Функция УбратьПробелыИзЧисла(Знач СтрокаЧисла) Экспорт
Результат = СтрокаЧисла;
Результат = СтрЗаменить(Результат, " ", "");
Результат = СтрЗаменить(Результат, Символы.НПП, "");
Результат = СтрЗаменить(Результат, Символы.Таб, "");
Результат = СтрЗаменить(Результат, Символы.ПС, "");
Результат = СтрЗаменить(Результат, Символы.ВК, "");
Возврат СокрЛП(Результат);
КонецФункции
Финальный СокрЛП() подстраховывает от пробелов по краям, если они появятся из символов, не перечисленных явно. Обратите внимание: СокрЛП() сам по себе пробелы внутри строки не удаляет — он обрезает только начало и конец, поэтому использовать его вместо СтрЗаменить() нельзя.
Если нужно оставить в строке только цифры и разделитель дробной части, можно пройтись по символам и отфильтровать лишнее. Это полезно, когда в данных встречаются буквы, знаки валют или другой «мусор»:
Функция ОставитьТолькоЦифры(Знач СтрокаЧисла)
Результат = "";
Допустимые = "0123456789.,";
Для Позиция = 1 По СтрДлина(СтрокаЧисла) Цикл
Символ = Сред(СтрокаЧисла, Позиция, 1);
Если СтрНайти(Допустимые, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Преобразование очищенной строки в число
После удаления пробелов строку нужно превратить в число. Здесь есть два подводных камня: разделитель дробной части и обработка ошибок.
Функция Число() ожидает точку в качестве разделителя дробной части. Если в исходных данных запятая («1250000,50»), преобразование завершится ошибкой. Поэтому перед вызовом Число() запятую заменяют на точку:
СтрокаБезПробелов = УбратьПробелыИзЧисла(СтрокаСуммы);
СтрокаБезПробелов = СтрЗаменить(СтрокаБезПробелов, ",", ".");
Попытка
Сумма = Число(СтрокаБезПробелов);
Исключение
Сумма = 0;
// Зафиксировать проблемное значение в журнале
КонецПопытки;
Обёртка в Попытка...Исключение обязательна при массовой загрузке: одна «битая» строка не должна обрывать обработку всего файла. При этом молча подставлять ноль без записи в журнал — плохая практика: ошибки в данных останутся незамеченными, а итоги будут неверными.
Как не допустить пробелы при выводе чисел
Часто проблему проще предотвратить, чем исправлять. Если число преобразуется в строку для выгрузки, задайте формат без разделителя групп — тогда неразрывные пробелы не появятся вовсе.
Используйте функцию Формат() с параметром ЧГ=0 (отключение группировки разрядов):
СтрокаДляВыгрузки = Формат(Сумма, "ЧГ=0");
// "1250000.5" вместо "1 250 000,5"
Аналогично в форматной строке для полей формы, печатных форм и схем компоновки данных: параметр ЧГ=0 убирает разделители групп. Это важно для машиночитаемых выгрузок (XML, CSV, обмен с банками), где пробелы-разделители недопустимы.
Выбор способа под задачу
Разные сценарии требуют разного подхода. Разовая очистка одного значения и промышленная загрузка файлов — не одно и то же.
Как выбрать действие
Для разработчика, поддерживающего обмены, оптимален связанный набор: функция очистки в общем модуле, единое правило замены запятой на точку и обязательное протоколирование значений, которые не удалось преобразовать. Это снимает большинство проблем ещё на этапе загрузки.
Как проверить результат
Содержит только цифры и один разделитель дробной части
Остались пробелы, буквы или несколько точек
Возвращает ожидаемое значение без исключения
Ошибка преобразования или ноль вместо реальной суммы
Совпадает с контрольной суммой источника
Расхождение — ищите строки, попавшие в журнал ошибок
Типичные ошибки при удалении пробелов
Первая и самая массовая ошибка — удаление только обычного пробела. Строка «1 250 000» с неразрывными пробелами после СтрЗаменить(С, " ", "") останется неизменной, и разработчик долго ищет причину, хотя визуально пробелы «на месте».
Вторая ошибка — использование СокрЛП() вместо замены. Функция обрезает пробелы только по краям строки, а разделители разрядов находятся внутри. Результат выглядит очищенным, но в число не преобразуется.
Третья ошибка — игнорирование разделителя дробной части. Даже идеально очищенная строка «1250000,50» с запятой не пройдёт через Число() без предварительной замены на точку.
Частые вопросы
Чем неразрывный пробел отличается от обычного в 1С?
Обычный пробел имеет код 32, неразрывный — код 160. Визуально они одинаковы, но для строковых функций это разные символы. 1С использует неразрывный пробел как разделитель групп разрядов при форматировании чисел, поэтому при очистке нужно удалять оба варианта: СтрЗаменить(С, " ", "") и СтрЗаменить(С, Символы.НПП, "").
Почему Число() выдаёт ошибку, хотя пробелы удалены?
Чаще всего причина в разделителе дробной части: функция Число() принимает только точку. Если в строке запятая, замените её: СтрЗаменить(Строка, ",", "."). Также проверьте, не осталось ли в строке букв, знака валюты или двух разделителей.
Можно ли убрать пробелы без программирования?
В типовых механизмах загрузки (например, при чтении табличных документов) настроек автоматической очистки обычно нет. В самом Excel перед загрузкой можно использовать «Найти и заменить», удалив пробелы в исходном файле. Но для регулярных загрузок надёжнее один раз написать функцию очистки в обработке.
Как вывести число в строку без пробелов-разделителей?
Используйте Формат(Число, "ЧГ=0"). Параметр ЧГ=0 отключает группировку разрядов, и неразрывные пробелы не появляются. Это стандартный способ подготовки чисел для XML-выгрузок, CSV и обмена с внешними системами.
Удалит ли СокрЛП пробелы внутри числа?
Нет. СокрЛП() обрезает пробельные символы только в начале и в конце строки. Разделители разрядов находятся в середине, поэтому для их удаления нужна СтрЗаменить(). СокрЛП полезен как финальный штрих после замен, но не как основное средство.
Что делать, если после очистки часть строк всё равно не преобразуется?
Соберите проблемные значения в журнал и посмотрите, какие символы в них встречаются — например, выведите коды символов через КодСимвола(). В данных из внешних систем иногда встречаются экзотические пробельные символы или буквы, похожие на цифры. После диагностики добавьте найденные символы в функцию очистки или перейдите на посимвольную фильтрацию.
Что важно запомнить
Удаляйте оба вида пробелов — обычный и неразрывный (Символы.НПП), заменяйте запятую на точку перед Число() и оборачивайте преобразование в Попытка...Исключение с записью ошибок. Для выгрузок форматируйте числа сразу с ЧГ=0, чтобы пробелы не появлялись вовсе.