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

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

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

Как убрать пробелы в числах в 1С: функция СтрЗаменить, неразрывный пробел Символ(160), преобразование строки в число, обработка данных из Excel и CSV.

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

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

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

Откуда берутся пробелы в числах

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

Вторая причина — загрузка из внешних источников. Excel, банковские клиенты, сайты и текстовые выгрузки часто хранят суммы в уже отформатированном виде. При чтении такого файла через табличный документ или COM-объект в 1С попадает строка с пробелами, а не чистое число.

Важно понимать разницу: если значение в 1С уже имеет тип «Число», пробелов в нём нет — пробелы существуют только в строковом представлении. Поэтому задача «убрать пробелы» всегда сводится либо к очистке строки перед преобразованием, либо к изменению формата вывода числа.

Удаление пробелов через СтрЗаменить

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

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

СтрокаСуммы = "1 234 567,89";

Очищенная = СтрЗаменить(СтрокаСуммы, Символ(160), "");

Очищенная = СтрЗаменить(Очищенная, " ", "");

Сумма = Число(Очищенная); // 1234567,89

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

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

Универсальная функция очистки строки перед преобразованием

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

Дополнительная защита — обёртка преобразования в попытку. Если в данных встретится значение, которое невозможно привести к числу (например, текст «нет в наличии»), обработка не упадёт с ошибкой, а вернёт 0 или запишет проблемную строку в журнал.

Функция СтрокаВЧислоБезопасно(Знач СтрокаЗначение)

Очищенная = СтрЗаменить(СтрокаЗначение, Символ(160), "");

Очищенная = СтрЗаменить(Очищенная, " ", "");

Очищенная = СтрЗаменить(Очищенная, Символы.Таб, "");

Очищенная = СтрЗаменить(Очищенная, Символы.ПС, "");

Попытка

Возврат Число(Очищенная);

Исключение

Возврат 0;

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

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

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

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

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

Управлять этим поведением позволяет функция Формат() с параметром группировки ЧГ. Значение ЧГ=0 отключает разделение групп разрядов, и число выводится слитно.

Сумма = 1234567.89;

Строка(Сумма); // "1 234 567,89"

Формат(Сумма, "ЧГ=0"); // "1234567,89"

Формат(Сумма, "ЧГ=0; ЧДЦ=2"); // "1234567,89"

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

В запросах аналогичную роль играет функция ПРЕДСТАВЛЕНИЕ(), но она возвращает представление с форматированием по умолчанию. Если нужна строка без разделителей, надёжнее вывести число из запроса и отформатировать его в коде.

Пробелы при загрузке из Excel и текстовых файлов

При чтении Excel через табличный документ (ТабличныйДокумент.Прочитать()) или COM-объект значение ячейки может прийти уже отформатированным. Если ячейка в Excel имеет числовой формат с разделителем разрядов, в зависимости от способа чтения вы получите либо чистое число, либо строку с пробелами.

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

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

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

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

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

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

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

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

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

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

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

Значение осталось строкой — пробелы не удалены

Дробная часть
Норма

Копейки сохранились: 1234567,89

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

Дробная часть обрезана или сумма увеличилась в 100 раз

Итоговая сумма загрузки
Норма

Совпадает с контрольной суммой из файла

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

Расхождение — есть строки с ошибкой преобразования

Типичные ошибки и ограничения методов

Самая распространённая ошибка — замена только обычного пробела. Код СтрЗаменить(Значение, " ", "") визуально выглядит рабочим, но неразрывный пробел остаётся, и Число() возвращает 0. Диагностировать это сложно, потому что в сообщениях и отладчике оба символа выглядят одинаково. Проверить код символа можно функцией КодСимвола(): 32 — обычный пробел, 160 — неразрывный.

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

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

Типичные ошибки
01
Замена только обычного пробела: Символ(160) остаётся, и Число() возвращает 0
02
Применение СтрЗаменить к значению, которое уже имеет тип Число — лишняя обработка и риск ошибки
03
Молчаливый возврат 0 в Попытке без фиксации ошибки — в документы попадают нулевые суммы
04
Разбор CSV по пробелу, когда пробел используется как разделитель разрядов внутри сумм
05
Использование Строка(Число) для выгрузки в другую систему — в файл уходят неразрывные пробелы

FAQ

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

Скорее всего, в числе используется неразрывный пробел (код 160), а заменяется обычный (код 32). Добавьте замену СтрЗаменить(Значение, Символ(160), ""). Проверить фактический код символа можно функцией КодСимвола() в отладчике.

Число() возвращает 0 вместо суммы. Что не так?

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

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

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

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

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

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

СокрЛП удаляет только пробельные символы в начале и конце строки, но не трогает пробелы между цифрами. Для числа «1 234 567» СокрЛП ничего не изменит — разделители разрядов внутри строки нужно удалять через СтрЗаменить.

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

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

Итог

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

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