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