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