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

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

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

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

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

Главная тонкость в том, что пробелы бывают разными. Обычный пробел с кодом 32 легко удаляется стандартными функциями, а вот неразрывный пробел (код 160), который часто приходит из Excel и веб-страниц, функциями СокрЛП и даже простой заменой обычного пробела не убирается. Поэтому универсальное решение строится на замене нескольких видов пробельных символов.

Почему в числах появляются пробелы

Самый распространённый источник — форматирование. Когда 1С выводит число в отчёт, табличный документ или на форму с включённой группировкой разрядов, значение 1234567,89 отображается как «1 234 567,89». В качестве разделителя используется именно неразрывный пробел, чтобы число не переносилось на другую строку. Если такое отформатированное значение потом считать обратно как строку, пробелы останутся внутри.

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

Третья причина — конкатенация и шаблоны. При сборке строк через Формат() или Шаблон сообщения число может быть вставлено уже в отформатированном виде, и дальнейшая попытка выполнить с ним арифметику завершится ошибкой преобразования.

Ошибка преобразования значения к типу ЧислоВ строке есть лишние символы

Проверьте наличие пробелов, неразрывных пробелов и букв в значении

Число возвращается как 0 без ошибкиТихое приведение типов

Проверьте, не обрезается ли строка до первого недопустимого символа

СтрЗаменить с пробелом не помогаетВ строке неразрывный пробел

Замените Символ(160) вместо обычного пробела

Пробелы видны только на формеВключена группировка разрядов

Проверьте свойство Группировка у поля ввода

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

Основной инструмент — встроенная функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Она заменяет все вхождения подстроки и не требует циклов. Чтобы убрать обычные пробелы из строки с числом, достаточно одной строки кода:

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

СтрокаБезПробелов = СтрЗаменить(СтрокаЧисла, " ", "");

// результат: "1234567,89"

Однако если пробел неразрывный, такая замена не сработает, потому что символ с кодом 160 — это другой символ. Поэтому правильный вариант — цепочка замен, покрывающая основные виды пробельных символов:

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

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

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

Результат = СтрЗаменить(Результат, Символ(9), ""); // табуляция

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

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

Такую функцию удобно разместить в общем модуле, чтобы вызывать её из любого места конфигурации — при загрузке данных, в обработчиках форм и в отчётах.

Чем СокрЛП отличается от удаления всех пробелов

Функции СокрЛ, СокрП и СокрЛП удаляют пробельные символы только в начале и в конце строки. Они полезны для очистки введённых значений от случайных отступов, но пробелы между цифрами внутри числа не трогают. Строка «1 234 567» после СокрЛП останется неизменной.

Поэтому правило простое: если нужно убрать отступы по краям — используйте СокрЛП, если нужно убрать разделители разрядов внутри числа — только СтрЗаменить. В большинстве реальных задач их комбинируют: сначала СокрЛП убирает краевые пробелы, затем СтрЗаменить удаляет внутренние.

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

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

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

После удаления пробелов строку нужно превратить в числовой тип. Оператор Число(Строка) выполняет преобразование, но при наличии любого недопустимого символа вызывает исключение. Разделитель дробной части при этом должен соответствовать ожиданиям платформы: в коде безопаснее привести строку к точке или запятой в зависимости от контекста.

Попытка

ЧисловоеЗначение = Число(ЧистаяСтрока);

Исключение

Сообщить("Не удалось преобразовать значение: " + ЧистаяСтрока);

ЧисловоеЗначение = 0;

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

Для безопасного преобразования в управляемых приложениях также используют ОписаниеТипов и метод ПривестиЗначение — он не генерирует исключение, а возвращает значение по умолчанию (ноль) при ошибке:

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

ЧисловоеЗначение = ОписаниеЧисла.ПривестиЗначение(ЧистаяСтрока);

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

Порядок действий
  1. 1
    Определите источник строки: импорт, ввод пользователя или форматированный вывод
  2. 2
    Удалите неразрывные пробелы через СтрЗаменить(Строка, Символ(160), "")
  3. 3
    Удалите обычные пробелы и табуляции через СтрЗаменить
  4. 4
    При необходимости примените СокрЛП для краевых отступов
  5. 5
    Преобразуйте строку через Число() в блоке Попытка или через ОписаниеТипов.ПривестиЗначение
  6. 6
    Проверьте результат на контрольном примере с разделителями разрядов

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

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

Для поля ввода на управляемой форме откройте палитру свойств и установите свойство «Группировка» в значение «Нет». Для программного форматирования используйте функцию Формат с параметром ЧГ (число группировки):

СтрокаБезГруппировки = Формат(1234567.89, "ЧГ=0");

// результат: "1234567,89" без пробелов

В запросах и СКД аналогичный эффект даёт настройка формата поля: в конструкторе СКД на вкладке «Наборы данных» или в пользовательских полях можно задать форматную строку без группировки разрядов.

Сравнение вариантов

СтрЗаменить

Универсально удаляет любые пробельные символы внутри строки; требует перечислить все виды пробелов вручную

СокрЛП

Убирает только краевые пробелы; не решает задачу разделителей разрядов

Формат с ЧГ=0

Подходит для вывода без пробелов; не очищает уже существующую строку

ОписаниеТипов.ПривестиЗначение

Безопасно преобразует очищенную строку в число без исключений; при ошибке вернёт ноль

Типичные ошибки и ограничения

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

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

Третья ошибка — игнорировать разделитель дробной части. После удаления пробелов строка «1234567,89» и строка «1234567.89» преобразуются по-разному в зависимости от настроек. Если источник данных использует точку, а ожидается запятая (или наоборот), добавьте нормализацию разделителя перед вызовом Число().

Наконец, не стоит применять очистку «в лоб» к полям, где пробелы значимы — например, к номерам договоров или артикулам, которые только выглядят как числа. Удаление пробелов там изменит ключевые данные и нарушит поиск и сопоставление.

Типичные ошибки
01
Замена только обычного пробела — неразрывный пробел остаётся, и Число() вызывает исключение
02
Применение СокрЛП к строке с разделителями разрядов — внутренние пробелы не удаляются
03
Преобразование через Число() без блока Попытка — одна битая строка прерывает всю загрузку
04
Очистка строковых реквизитов, похожих на числа, — теряются значимые пробелы в номерах и артикулах

Проверка результата

После очистки и преобразования убедитесь, что результат корректен. Самый простой способ — вывести тип и значение через Сообщить или проверить в отладчике: тип должен быть «Число», а значение — совпадать с исходным по величине.

Сообщить(ТипЗнч(ЧисловоеЗначение)); // Число

Сообщить(ЧисловоеЗначение); // 1234567,89

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

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

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

Тип значения после преобразования
Норма

ТипЗнч возвращает Число

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

Значение осталось строкой или стало Неопределено

Строка после очистки
Норма

Остались только цифры, разделитель и знак минуса

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

Присутствуют невидимые символы или буквы

Значение на контрольном примере
Норма

1 234 567,89 превращается в 1234567,89

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

Получается 0 или ошибка преобразования

Часто задаваемые вопросы

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

Скорее всего, в строке неразрывный пробел с кодом 160, который визуально выглядит как обычный. Используйте СтрЗаменить(Строка, Символ(160), "") — именно такой символ 1С подставляет при группировке разрядов и именно он приходит из Excel и веб-страниц.

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

В языке запросов нет функции замены подстроки, поэтому очистку делают до передачи данных в запрос (на стороне кода) или после — при обходе выборки. Если данные грузятся из табличного документа или таблицы значений, очистите колонку перед помещением во временную таблицу.

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

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

Как вывести число без пробелов в печатной форме?

Используйте функцию Формат со строкой параметра ЧГ=0, например: Формат(Сумма, "ЧД=2; ЧГ=0"). Либо отключите группировку разрядов в свойствах поля формы или в настройках формата области макета табличного документа.

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

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

Что безопаснее: Число() или ПривестиЗначение?

Для разовой проверки подходит Число() в блоке Попытка — вы получите текст ошибки и сможете её зафиксировать. Для массовой загрузки удобнее ОписаниеТипов.ПривестиЗначение: процесс не прервётся, а некорректные значения станут нулями, которые легко отфильтровать и разобрать отдельно.

Итог

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

Пробелы из числа в 1С удаляются функцией СтрЗаменить, причём заменять нужно и обычный пробел, и неразрывный (Символ(160)). СокрЛП убирает только краевые отступы. Для преобразования в число используйте Число() в блоке Попытка или ОписаниеТипов.ПривестиЗначение, а для вывода без пробелов — Формат с параметром ЧГ=0 или отключение группировки в свойствах поля.