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

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

1С: как убрать неразрывный пробел из числа

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

При выгрузке чисел из 1С в Excel, при обмене данными или при программной обработке строк часто возникает проблема: число «1 234 567,89» не распознаётся как число, потому что между разрядами стоит не обычный пробел, а неразрывный (код символа 160). Визуально он неотличим от обычного пробела (код 32), поэтому простая замена пробела не срабатывает, и разработчик долго ищет причину ошибки.

Неразрывный пробел появляется в 1С автоматически: платформа форматирует числа с группировкой разрядов при выводе в табличный документ, при преобразовании числа в строку с настройками региональных стандартов, при копировании данных из ячеек. Также он приходит извне — из Excel, веб-страниц, PDF и буфера обмена.

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

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

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

Проверить состав строки можно программно, перебрав коды символов:

Строка = "1 234,56";

Для Позиция = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, Позиция, 1);

Сообщить(Символ + " — код " + КодСимвола(Символ));

КонецЦикла;

Если среди кодов встречается 160 — это неразрывный пробел. Также встречаются «узкий неразрывный пробел» (код 8239) и другие юникод-пробелы, особенно при копировании из веб-страниц и Word.

Число() выдаёт ошибку на строке с пробеламиВ строке неразрывный пробел

Проверьте коды символов через КодСимвола()

СтрЗаменить по пробелу не помогаетПробел имеет код 160, а не 32

Заменяйте Символ(160), а не " "

Данные пришли из Excel или вебаВозможны разные юникод-пробелы

Обрабатывайте коды 160 и 8239

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

Самый прямой метод — заменить неразрывный пробел на пустую строку, а затем преобразовать результат в число:

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

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

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

Результат = Число(СтрокаБезПробелов);

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

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

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

Универсальная функция очистки строки

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

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

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

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

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

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

Попытка

Возврат Число(Строка);

Исключение

Возврат 0;

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

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

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

Неразрывный пробел в запросах и СКД

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

В СКД неразрывный пробел появляется при выводе чисел в табличный документ: там работает форматирование с группировкой разрядов. Если результат отчёта потом выгружают в Excel и он «не считается», уберите группировку в форматной строке поля: в настройках поля компоновки задайте формат ЧГ= (пустая группировка) или ЧГ=0 в зависимости от версии платформы. Параметр ЧГ управляет именно группировкой разрядов.

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

Очистка при загрузке из Excel и внешних источников

Excel — самый частый источник неразрывных пробелов. При чтении через COM-объект или табличный документ числовые ячейки могут приходить как отформатированные строки. Читайте значение ячейки, а не её отображаемый текст: у COM-объекта Excel это свойство Value вместо Text, в табличном документе 1С — реквизит «Значение» расшифровки или чтение области как значения.

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

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

Профилактика: как не допустить проблему

Лучшее решение — не допускать появления неразрывных пробелов там, где числа будут обрабатываться программно. Используйте форматную строку Формат(Значение, "ЧГ=") при любом преобразовании числа в строку для файлов обмена, печатных форм, которые будут распознаваться, и веб-сервисов.

Для реквизитов, где хранятся числа, задавайте числовой тип данных, а не строковый. Строковое хранение чисел рано или поздно приводит к проблемам сортировки («10» раньше «2»), сравнения и форматирования — неразрывный пробел лишь одно из следствий.

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

Проверка результата и границы самостоятельной работы

После внедрения очистки проверьте преобразование на контрольном наборе: число без пробелов, число с неразрывным пробелом, число с обычным пробелом, отрицательное число, число с запятой и с точкой, пустая строка, строка с буквами. Каждый случай должен давать предсказуемый результат.

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

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

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

Число("1 234,5") после очистки
Норма

Возвращает 1234,5 без ошибки

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

Ошибка преобразования или 0

Выгрузка отчёта в Excel
Норма

Числа суммируются формулами Excel

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

Числа воспринимаются как текст

Сортировка числовой колонки
Норма

2 идёт раньше 10

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

Строковый порядок: 10 раньше 2

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

Чем неразрывный пробел отличается от обычного?

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

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

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

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

В табличном документе 1С или в Excel используйте «Найти и заменить»: скопируйте неразрывный пробел прямо из ячейки с числом в поле «Найти» и замените на пустую строку. Вводить пробел с клавиатуры в поле поиска бесполезно — это будет другой символ.

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

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

Как запретить группировку разрядов при выводе числа в строку?

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

Влияет ли очистка строк на производительность при больших объёмах?

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

Итог

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

Неразрывный пробел — это Символ(160), он удаляется через СтрЗаменить по коду символа, а не по обычному пробелу. Для надёжности чистите коды 160 и 8239, контролируйте десятичный разделитель, а при выводе чисел в строку используйте Формат с параметром ЧГ=, чтобы проблема не возникала вовсе.