Разработка и Конфигурация · 11 мин
Как убрать пробел между цифрами в 1С
Как убрать пробел между цифрами в 1С: СтрЗаменить, неразрывные пробелы, настройки формата числа, обработка строк и проверка результата.
Пробелы между цифрами в 1С появляются по двум основным причинам. Первая — автоматическая группировка разрядов при выводе числа: платформа по умолчанию показывает «1 234 567,89», разделяя тысячи неразрывными пробелами. Вторая — данные, загруженные из внешних источников (Excel, банковские выписки, сайты), где пробелы уже вшиты в строку, и 1С воспринимает значение как текст, а не как число.
Проблема практическая: строка «1 500» не сравнивается с числом 1500, не участвует в расчётах, ломает сортировку и поиск, а при обмене данными вызывает ошибки преобразования типов. Поэтому убрать пробелы нужно либо на уровне формата вывода, либо программно — обработкой строки.
Ниже разобраны оба сценария: настройка отображения чисел без группировки разрядов и очистка строковых данных встроенными функциями языка 1С. Отдельно рассмотрен коварный случай с неразрывным пробелом, который визуально неотличим от обычного, но не удаляется стандартной заменой.
Откуда берутся пробелы между цифрами
При выводе числа в отчёт, табличный документ или на форму 1С применяет региональные настройки группировки разрядов. Число 1234567 превращается в «1 234 567». Важно: это только визуальное представление — само число в памяти пробелов не содержит, и расчёты с ним работают корректно.
Совсем другая ситуация — когда пробелы находятся внутри строкового значения. Такое происходит при загрузке данных из Excel, при копировании сумм с сайтов и из PDF, при обмене с банковскими системами. Значение «12 500» в реквизите типа «Строка» — это текст, и попытка сложить его с числом даст ошибку или неверный результат.
Третий источник — ручной ввод. Пользователь копирует номер договора, артикул или сумму из письма и вставляет в поле вместе с пробелами. Если реквизит строковый, данные сохраняются как есть и потом мешают поиску и сопоставлению.
Проверьте форматную строку поля — число само по себе чистое
Откройте значение на редактирование и посмотрите тип реквизита
Проверьте код символа через КодСимвола()
Убираем пробелы функцией СтрЗаменить
Основной инструмент — встроенная функция СтрЗаменить(). Она принимает три параметра: исходную строку, что искать и на что заменить. Чтобы удалить пробелы, заменяем их на пустую строку:
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");
Функция заменяет все вхождения, а не только первое, поэтому «1 234 567» превратится в «1234567» за один вызов. Это безопасная операция: исходное значение не меняется, результат возвращается в новую переменную.
Типовой сценарий — очистка строки перед преобразованием в число:
СтрокаСуммы = "1 234 567,89";
ЧистаяСтрока = СтрЗаменить(СтрокаСуммы, " ", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символ(160), "");
Сумма = Число(ЧистаяСтрока);
Обратите внимание на порядок: сначала удаляются все виды пробелов, только потом выполняется преобразование через Число(). Если в строке останется хоть один посторонний символ, функция Число() вызовет исключение, поэтому в рабочем коде преобразование стоит оборачивать в Попытка/Исключение.
СтрокаБезПробелов = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, " ", ""), Символ(160), "");Неразрывный пробел: почему замена не работает
Самая частая причина «нерабочего» СтрЗаменить — неразрывный пробел. Визуально он выглядит как обычный пробел, но имеет код 160 (в отличие от обычного пробела с кодом 32). Именно неразрывными пробелами 1С разделяет разряды при выводе чисел, ими же отделяют тысячи числа, скопированные из Excel и веб-страниц.
Проверить, какой именно символ стоит между цифрами, можно функцией КодСимвола(). Например, взять третий символ строки «12 500» и посмотреть его код: если вернулось 32 — это обычный пробел, если 160 — неразрывный.
Удаляется неразрывный пробел так же, через СтрЗаменить, но с явным указанием символа:
Результат = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");
Надёжная практика — удалять оба типа пробелов подряд, как показано в примере выше. Это гарантирует чистую строку независимо от того, откуда пришли данные.
Убираем пробелы при выводе числа через формат
Если пробелы появляются только при отображении числа, правильнее не чистить строку, а настроить формат вывода. Для этого используется функция Формат() с параметром группировки:
СтрокаЧисла = Формат(Сумма, "ЧГ=0");
Параметр ЧГ=0 отключает группировку разрядов, и число 1234567,89 выведется как «1234567,89» без разделителей. Этот же параметр можно задать в свойствах поля формы или ячейки табличного документа — в палитре свойств откройте «Формат» и в строке формата укажите ЧГ=0.
В запросах аналогичную задачу решает конструкция ВЫРАЗИТЬ с последующим форматированием уже на уровне компоновки, но чаще формат настраивают в макете отчёта: для числового поля в схеме компоновки данных на вкладке «Наборы данных» или в оформлении поля указывается та же форматная строка.
Два подхода к удалению пробелов
Подходит для строковых данных из файлов, ввода пользователя, обменов. Работает с любым текстом, но требует явной обработки каждого значения.
Подходит для отображения чисел в отчётах, формах и печати. Не меняет данные, влияет только на представление. Не применим к уже испорченным строкам.
Очистка данных при загрузке из Excel и внешних источников
При загрузке из Excel через табличный документ или COM-объект числа часто приходят как строки с пробелами-разделителями. Правильное место для очистки — сразу после чтения ячейки, до записи в реквизит:
ЗначениеЯчейки = СокрЛП(ТабДок.Область(Строка, Колонка).Текст);
ЗначениеЯчейки = СтрЗаменить(ЗначениеЯчейки, " ", "");
ЗначениеЯчейки = СтрЗаменить(ЗначениеЯчейки, Символ(160), "");
ЗначениеЯчейки = СтрЗаменить(ЗначениеЯчейки, Символ(9), ""); // табуляция
Кроме пробелов, из внешних источников приходят табуляции (код 9) и переводы строк. Если данные копируются из веба, возможны и другие невидимые символы. Универсальный вариант — оставить в строке только цифры и допустимые разделители, перебрав символы в цикле, но для большинства задач достаточно трёх замен, показанных выше.
После очистки обязательно проверьте результат перед преобразованием: пустая строка или строка с буквами при вызове Число() даст ошибку. Минимальная защита — проверка на пустоту и обработка исключения с записью проблемной строки в журнал, чтобы потом разобрать исходные данные.
- 1Получите исходное значение и примените СокрЛП для удаления краевых пробелов
- 2Удалите обычные пробелы: СтрЗаменить(Значение, " ", "")
- 3Удалите неразрывные пробелы: СтрЗаменить(Значение, Символ(160), "")
- 4Проверьте, что строка не пустая и содержит только цифры и разделитель
- 5Преобразуйте через Число() внутри блока Попытка/Исключение
- 6Проверьте результат на контрольном примере: сумма с разрядами должна стать корректным числом
Типичные ошибки и как их избежать
Первая ошибка — замена только обычного пробела. Код отрабатывает без ошибок, но неразрывные пробелы остаются, и преобразование в число падает. Симптом коварный: в отладчике строка выглядит чистой.
Вторая ошибка — удаление пробелов из строки, где они значимы. Например, в номере «АБВ 123 456» или в адресе пробелы часть данных, и слепая очистка всей строки их испортит. Удаляйте пробелы только из полей, где ожидается число, либо очищайте только разрядные разделители по шаблону.
Третья ошибка — разделитель дробной части. В русской локали это запятая, в данных из внешних систем часто точка. После удаления пробелов строка «1234.56» не преобразуется функцией Число() корректно в русской локали — точку нужно предварительно заменить на запятую или использовать описание типа с учётом формата.
Проверка результата
После очистки убедитесь, что строка действительно стала числом и не потеряла значение. Простейшая проверка — длина строки до и после: разность должна равняться количеству удалённых пробелов. Если строка стала короче ожидаемого, возможно, удалилось лишнее.
Для контроля преобразования сравните результат с исходным значением арифметически: например, сумма по колонке очищенных значений должна совпасть с контрольной суммой из источника. При загрузке из Excel это самый надёжный способ убедиться, что ни одно число не исказилось.
В отладчике проверить «невидимые» символы можно, выведя коды всех символов строки в цикле через КодСимвола(). Любой код, отличный от цифр (48–57) и разделителя, указывает на посторонний символ.
Как проверить результат очистки
Только цифры и, при необходимости, разделитель дробной части
Остались символы с кодом 160, 9 или буквы
Возвращает число без исключения
Ошибка преобразования значения к типу Число
Совпадает с суммой в источнике
Расхождение — значит, часть значений искажена или потеряна
Частые вопросы
Почему СтрЗаменить не убирает пробел, хотя он виден?
Почти наверняка это неразрывный пробел с кодом 160, а не обычный пробел с кодом 32. Проверьте символ функцией КодСимвола() и удалите его через СтрЗаменить(Строка, Символ(160), ""). Такие пробелы типичны для чисел, скопированных из Excel, браузера и из самих отчётов 1С.
Как убрать пробелы в числе без программирования?
Если пробелы появляются только при отображении, откройте свойства поля формы или ячейки макета, найдите параметр «Формат» и укажите строку ЧГ=0 — группировка разрядов отключится. Если пробелы уже сохранены в строковом реквизите множества объектов, без обработки данных не обойтись: используйте типовую обработку «Групповое изменение реквизитов» или напишите простую процедуру замены.
Можно ли убрать пробелы только между цифрами, не трогая остальные?
Да, но простой заменой этого не сделать. Нужно перебрать строку посимвольно и удалять пробел только если соседние символы — цифры, либо использовать регулярные выражения через COM-объект VBScript.RegExp или аналоги. На практике чаще очищают целиком те поля, где ожидается только число.
Число() выдаёт ошибку даже после удаления пробелов. Что ещё мешает?
Частые причины: разделитель дробной части в виде точки вместо запятой, символ валюты или знак «№» в строке, табуляция или перевод строки, а также минус нестандартного начертания из скопированного текста. Выведите коды всех символов через КодСимвола() — это быстро покажет посторонний символ.
Отключение группировки разрядов влияет на хранимые данные?
Нет. Параметр ЧГ=0 меняет только представление числа при выводе — в отчёте, на форме или в печатной форме. Само число в базе остаётся прежним, все расчёты и обмены работают как раньше.
Как массово очистить пробелы в реквизите существующих объектов?
Напишите обработку: запросом выберите объекты, где реквизит содержит пробел или Символ(160), в цикле примените СтрЗаменить и запишите объект. Перед запуском на рабочей базе сделайте резервную копию и проверьте обработку на нескольких тестовых элементах, особенно если по этому реквизиту выполняется поиск или обмен.
Что важно запомнить
Пробелы между цифрами — это либо группировка разрядов при выводе (решается форматом ЧГ=0), либо символы внутри строки (решается СтрЗаменить). Всегда удаляйте и обычный пробел, и неразрывный Символ(160), а преобразование в число выполняйте внутри Попытка/Исключение с проверкой контрольных сумм.