Разработка и Конфигурация · 8 мин
Как убрать пробелы в числе в 1С
Как убрать пробелы в числе в 1С: функции СтрЗаменить, Формат, Число, обработка неразрывных пробелов и групп разрядов. Примеры кода и типичные ошибки.
Пробелы в числах — частая проблема при работе с 1С: они появляются при копировании данных из Excel, при загрузке выписок из банка, при выводе чисел с группировкой разрядов. Строка вида «1 234 567,89» выглядит как число, но для платформы это текст, и попытка выполнить с ней арифметические операции приведёт к ошибке преобразования или нулевому результату.
Задача усложняется тем, что «пробел» в числе может быть не обычным символом с кодом 32, а неразрывным пробелом (код 160) — именно его 1С подставляет при форматировании чисел с разделителем групп. Простая замена обычного пробела в этом случае ничего не даст, и разработчик долго ищет причину.
Ниже разобраны рабочие способы убрать пробелы из строки с числом: встроенные функции языка, универсальная функция очистки, обработка данных при загрузке и настройка форматирования, чтобы пробелы не появлялись вовсе.
Почему в числах появляются пробелы и какие они бывают
Источников пробелов три. Первый — форматирование при выводе: когда 1С преобразует число в строку с разделением групп разрядов, между тысячами вставляется неразрывный пробел. Второй — внешние данные: Excel, банковские выписки, сайты и текстовые файлы часто содержат числа, отформатированные с пробелами. Третий — ручной ввод: пользователь копирует значение из письма или документа вместе с лишними символами.
Принципиально важно различать два символа:
- Обычный пробел — код 32, вставляется с клавиатуры, встречается в данных из внешних источников.
- Неразрывный пробел — код 160, его 1С и Excel ставят между группами разрядов, чтобы число не переносилось на другую строку.
Визуально они неотличимы, но функция СтрЗаменить с обычным пробелом не трогает неразрывный. Проверить, какой именно символ стоит в строке, можно функцией КодСимвола(): например, КодСимвола(Сред(Строка, 2, 1)) покажет 32 или 160.
Способ 1. СтрЗаменить — быстрое удаление пробелов
Самый простой вариант — функция СтрЗаменить, которая заменяет все вхождения подстроки:
СтрокаЧисла = "1 234 567,89";
ЧистаяСтрока = СтрЗаменить(СтрокаЧисла, " ", "");
Результат = Число(ЧистаяСтрока);
Этот код работает, только если все пробелы обычные. Чтобы охватить и неразрывный пробел, добавьте вторую замену:
ЧистаяСтрока = СтрЗаменить(СтрокаЧисла, " ", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символ(160), "");
Результат = Число(ЧистаяСтрока);
Функция Число() преобразует очищенную строку в числовой тип. Если после очистки в строке остались недопустимые символы (буквы, знак валюты), Число() вызовет ошибку «Преобразование значения к типу Число не может быть выполнено», поэтому перед преобразованием строку стоит проверить.
Способ 2. Универсальная функция очистки строки от лишних символов
Когда данные приходят из непредсказуемых источников, лучше не перечислять символы для удаления, а оставить только допустимые: цифры, запятую или точку, знак минуса. Такая функция устойчива к любым «сюрпризам» во входных данных:
Функция СтрокуВЧисло(Знач ВходнаяСтрока)
Допустимые = "0123456789,.-";
Результат = "";
Для Поз = 1 По СтрДлина(ВходнаяСтрока) Цикл
Символ = Сред(ВходнаяСтрока, Поз, 1);
Если СтрНайти(Допустимые, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Результат = СтрЗаменить(Результат, ",", ".");
Возврат ?(Результат = "", 0, Число(Результат));
КонецФункции
Обратите внимание на замену запятой на точку: в строковом представлении для функции Число() разделителем дробной части должна быть точка, а данные из русскоязычных источников обычно содержат запятую. Если разделитель не заменить, часть «,89» будет отброшена или вызовет ошибку.
Способ 3. Настройка форматирования, чтобы пробелы не появлялись
Если пробелы возникают при выводе числа в строку внутри самой 1С, правильнее не чистить результат, а отключить группировку разрядов на этапе форматирования. Это делается через функцию Формат() с параметром ЧГ (число групп):
Сумма = 1234567.89;
СтрокаБезПробелов = Формат(Сумма, "ЧГ=0");
Параметр ЧГ=0 запрещает группировку разрядов, и в результате получается «1234567,89» без каких-либо пробелов. Тот же эффект даёт строка формата "ЧГ=" с пустым разделителем.
В формах и отчётах группировку можно отключить без кода: у поля ввода или колонки таблицы в свойстве «Формат» уберите разделитель групп или задайте строку формата вручную. Для СКД аналогичная настройка находится на закладке «Наборы данных» в оформлении поля.
Сравнение вариантов
Быстро и просто, но требует знать, какие именно пробелы в строке. Подходит для разовой обработки известных данных.
Оставляет только цифры и разделители, устойчива к любым лишним символам. Чуть медленнее, оптимальна для загрузки внешних данных.
Предотвращает появление пробелов, а не удаляет их. Правильный выбор, когда число формируется внутри 1С.
Обработка пробелов при загрузке данных из Excel и файлов
При загрузке из Excel через табличный документ или COM-соединение ячейки с числами часто приходят как строки с неразрывными пробелами. Типичная схема обработки: прочитать значение, очистить, преобразовать, записать. Очистку удобно вынести в отдельную функцию и вызывать её для каждой ячейки с суммой.
Отдельный случай — CSV и текстовые файлы. Там число с пробелами может развалиться на несколько колонок, если разделителем полей служит пробел или табуляция. Перед разбором файла проверьте, какой разделитель реально используется, и не применяйте удаление пробелов до разбиения строки на поля — иначе потеряете структуру данных.
Что важно запомнить
Пробелы в числах 1С бывают обычными (32) и неразрывными (160) — удалять нужно оба. Для известных данных достаточно СтрЗаменить, для внешних — универсальной функции очистки, а если число формируется в самой 1С, правильнее отключить группировку через Формат с ЧГ=0. Перед Число() всегда заменяйте запятую на точку и проверяйте строку на пустоту.
Частые вопросы
Почему СтрЗаменить не убирает пробел в числе?
Скорее всего, в строке неразрывный пробел с кодом 160, а не обычный с кодом 32. Добавьте вторую замену: СтрЗаменить(Строка, Символ(160), ""). Проверить код символа можно функцией КодСимвола().
Как убрать пробелы из числа в запросе 1С?
В языке запросов нет функции замены произвольных символов. Выгрузите результат запроса в таблицу значений и обработайте строки в цикле на встроенном языке, либо очищайте данные до того, как они попадают в базу.
Число() выдаёт ошибку после удаления пробелов — в чём причина?
В строке остались недопустимые символы: запятая вместо точки, знак валюты, буквы или пустая строка. Выведите очищенную строку в сообщение и посмотрите, что реально передаётся в Число().
Как вывести число без пробелов в печатной форме?
Используйте Формат(Сумма, "ЧГ=0") при заполнении параметров макета. Если форма построена на табличном документе, можно также задать формат в свойствах ячейки макета, убрав разделитель групп.
Можно ли убрать пробелы сразу во всех числовых реквизитах документа?
Если реквизит имеет тип «Число», пробелов в нём быть не может — пробелы существуют только в строковых представлениях. Чистить нужно строковые реквизиты, где числа хранятся как текст, например через обработку группового изменения реквизитов или небольшую сервисную обработку.
Чем неразрывный пробел отличается от обычного на практике?
Обычный пробел ставится с клавиатуры и позволяет перенос строки, неразрывный (код 160) склеивает части числа и используется программами как разделитель разрядов. Для функций обработки строк это разные символы, и заменять их нужно по отдельности.