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

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

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

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

Пробелы в числах — одна из самых частых причин ошибок преобразования типов в 1С 8. Они появляются при выгрузке данных из Excel, при копировании из веб-страниц, при обмене с банковскими системами и даже при штатном форматировании числа функцией Формат(), которая по умолчанию разделяет группы разрядов. Если передать такую строку в функцию Число(), платформа вернёт 0 или выдаст ошибку «Преобразование значения к типу Число не может быть выполнено».

Главная сложность в том, что «пробел» в числе — это почти всегда не обычный символ с кодом 32, а неразрывный пробел (код 160, Символ(160)) или узкий неразрывный пробел (код 8239). Функция СокрЛП() такие символы внутри строки не трогает, а визуально они неотличимы. Поэтому рабочее решение строится на замене конкретных символов через СтрЗаменить().

Ниже разобраны все практические сценарии: очистка строки перед преобразованием в число, отключение группировки разрядов при выводе, обработка загрузок из Excel и типичные ошибки, из-за которых «чистый» код всё равно падает.

Почему в числах появляются пробелы и почему Число() возвращает 0

Платформа 1С при форматировании чисел по умолчанию группирует разряды: значение 1234567,89 выводится как «1 234 567,89». Разделитель групп — неразрывный пробел, а не обычный. То же самое происходит в Excel, в бухгалтерских выгрузках, в интернет-банках: человеку читать удобно, а программа такую строку числом не считает.

Функция Число() во встроенном языке строгая: она принимает строку только в «каноническом» виде — цифры, необязательный минус и одна точка как разделитель дробной части. Любой посторонний символ, включая пробел, запятую-разделитель тысяч или символ валюты, приводит к ошибке преобразования либо к тихому возврату 0 — в зависимости от контекста (в выражениях запроса и при присваивании реквизиту поведение может отличаться).

Отдельная ловушка — разделитель дробной части. В российских выгрузках дробная часть часто отделена запятой («1 234,56»), а Число() ожидает точку. Поэтому полноценная очистка обычно включает и замену запятой на точку, если данные приходят из русскоязычных источников.

Базовый способ: СтрЗаменить и Число

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

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

// Убираем все виды пробелов

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

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

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

// Приводим разделитель дробной части к точке

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

Результат = Число(СтрокаЧисла); // 1234567.89

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

bsl
Функция СтрокаВЧисло(Строка)
	Строка = СтрЗаменить(Строка, " ", "");
	Строка = СтрЗаменить(Строка, Символ(160), "");
	Строка = СтрЗаменить(Строка, Символ(8239), "");
	Строка = СтрЗаменить(Строка, ",", ".");
	Возврат Число(Строка);
КонецФункции

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

Если проблема не во входных данных, а в том, что ваша программа сама формирует число с пробелами — например, для файла обмена, где разделители разрядов запрещены, — используйте функцию Формат() с параметром ЧГ=0 (ЧГ — разделитель групп, 0 означает «не группировать»).

Сумма = 1234567.89;

СтрокаСПробелами = Формат(Сумма, "ЧДЦ=2"); // "1 234 567,89"

СтрокаБезПробелов = Формат(Сумма, "ЧДЦ=2; ЧГ=0"); // "1234567,89"

// Вариант с точкой как разделителем дробной части

СтрокаДляXML = Формат(Сумма, "ЧРД=.; ЧДЦ=2; ЧГ=0"); // "1234567.89"

Тот же параметр доступен в свойствах полей формы и ячеек табличного документа: в палитре свойств найдите «Формат», откройте конструктор форматной строки и снимите флажок группировки разрядов (или вручную пропишите ЧГ=0). Это избавит от пробелов в печатных формах и в отчётах, выгружаемых в электронном виде.

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

Чистка данных при загрузке из Excel и внешних файлов

При чтении Excel через COM-объект или через табличный документ ячейка с числом нередко приходит как строка «12 500,00». Причина — формат ячейки «Текстовый» либо то, что значение читается как отображаемый текст, а не как сырое значение. Если читаете через ТабличныйДокумент, обращайтесь к свойству Значение области, а не к Текст — значение уже будет типа Число, и чистка не понадобится.

Если доступно только текстовое представление, применяйте функцию очистки из раздела выше. Дополнительно в банковских и складских выгрузках встречаются: символ валюты («1 234,56 руб.»), знак минус нестандартного вида (длинное тире вместо дефиса) и пробел в конце строки. Их тоже стоит удалять явно.

Порядок действий при загрузке чисел из файла
  1. 1
    Прочитайте значение ячейки; если доступно свойство Значение — используйте его вместо Текст
  2. 2
    Удалите обычный, неразрывный и узкий неразрывный пробелы через СтрЗаменить
  3. 3
    Уберите символы валюты и прочие посторонние знаки, замените запятую на точку
  4. 4
    Преобразуйте через Число() внутри блока Попытка/Исключение
  5. 5
    Запишите в журнал строки, которые не преобразовались, чтобы проверить их вручную

Для CSV-файлов дополнительно проверьте, не используется ли пробел как разделитель колонок. Если да — сначала разбивайте строку на колонки (СтрРазделить), и только потом чистите каждое значение, иначе удаление пробелов склеит соседние поля.

Проверка, что строка действительно стала числом

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

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

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

Состав строки после СтрЗаменить
Норма

Только цифры, одна точка, минус в начале

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

Остались пробелы, буквы, символы валюты

Результат Число()
Норма

Возвращает ожидаемое значение, дробная часть на месте

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

Возвращает 0 или целую часть без дробной

Отрицательные значения
Норма

Минус сохранился, число отрицательное

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

Минус потерян при замене тире, число стало положительным

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

Ещё один способ валидации — функция ОписаниеТипа с методом ПривестиЗначение(): она мягче Число() и не выбрасывает исключение, но тоже вернёт 0 для «грязной» строки, поэтому предварительная очистка всё равно обязательна.

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

Типичные ошибки
01
Заменяют только обычный пробел (код 32) — неразрывный пробел Символ(160) остаётся, и Число() снова падает
02
Применяют СокрЛП к строке с пробелами внутри — функция обрезает только края, разряды внутри числа не трогает
03
Забывают заменить запятую на точку — Число("1234,56") даёт ошибку или неверный результат
04
Удаляют пробелы до разбора CSV-строки на колонки — соседние поля склеиваются в одно
05
Чистят данные в цикле без Попытка/Исключение — одна битая строка прерывает всю загрузку

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

Также учтите, что Число() не понимает экспоненциальную запись вида «1,5E+06» в некоторых контекстах и не воспринимает разделитель тысяч-апостроф («1'234'567»), который встречается в выгрузках швейцарских и некоторых ERP-систем. Такие случаи обрабатываются дополнительными заменами.

Выбор подхода под вашу задачу

Маршрут решения

Как выбрать действие

Строка с пробелами приходит из файла или от пользователя, нужно получить числоСтрЗаменить по трём кодам пробелов + замена запятой на точку + Число() в Попытке
Программа сама формирует число с пробелами для файла обменаФормат(Значение, "ЧГ=0") — пробелы не появятся вовсе
Пробелы мешают в печатной форме или отчётеСнимите группировку разрядов в форматной строке ячейки табличного документа
Читаете Excel через табличный документИспользуйте свойство Значение области вместо Текст — очистка не понадобится

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

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

Итог

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

Пробел в числе — почти всегда неразрывный (Символ(160)) или узкий неразрывный (Символ(8239)) пробел. Убирайте все три вида через СтрЗаменить, заменяйте запятую на точку и преобразуйте через Число() в блоке Попытка. Чтобы пробелы не появлялись при выводе, используйте Формат() с параметром ЧГ=0.

Частые вопросы

Почему СокрЛП не убирает пробелы в числе?

СокрЛП обрезает пробельные символы только по краям строки. Пробелы между разрядами находятся внутри, поэтому функция их не затрагивает. Используйте СтрЗаменить для удаления символов в любом месте строки.

Число() возвращает 0, хотя пробелы убрал. Что не так?

Скорее всего, в строке остался неразрывный пробел (код 160) или узкий неразрывный (код 8239), либо дробная часть отделена запятой. Проверьте строку посимвольно через КодСимвола() и добавьте недостающие замены.

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

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

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

Откройте свойства ячейки табличного документа, найдите «Формат» и добавьте параметр ЧГ=0 (например, «ЧДЦ=2; ЧГ=0»). Либо формируйте строку в коде через Формат(Сумма, "ЧГ=0") и выводите её как текст.

Как определить, какой именно пробел стоит в строке?

Пройдите по строке циклом и выведите КодСимвола(Строка, Н) для каждого символа. Обычный пробел — 32, неразрывный — 160, узкий неразрывный — 8239, табуляция — 9. Зная код, добавьте точную замену.

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

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