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