Разработка и Конфигурация · 10 мин
Как убрать пробелы в числах в 1С 8
Способы убрать пробелы в числах в 1С 8: СтрЗаменить, неразрывный пробел, функция Число, форматная строка. Примеры кода, ошибки и проверка результата.
Пробелы в числах — одна из самых частых причин ошибок преобразования типов в 1С 8. Они появляются при выгрузке данных из Excel, при копировании из веб-страниц, при обмене с банковскими системами и даже при штатном форматировании числа функцией Формат(), которая по умолчанию разделяет группы разрядов. Если передать такую строку в функцию Число(), платформа вернёт 0 или выдаст ошибку «Преобразование значения к типу Число не может быть выполнено».
Главная сложность в том, что «пробел» в числе — это почти всегда не обычный символ с кодом 32, а неразрывный пробел (код 160, Символ(160)) или узкий неразрывный пробел (код 8239). Функция СокрЛП() такие символы внутри строки не трогает, а визуально они неотличимы. Поэтому рабочее решение строится на замене конкретных символов через СтрЗаменить().
Ниже разобраны все практические сценарии: очистка строки перед преобразованием в число, отключение группировки разрядов при выводе, обработка загрузок из Excel и типичные ошибки, из-за которых «чистый» код всё равно падает.
Почему в числах появляются пробелы и почему Число() возвращает 0
Платформа 1С при форматировании чисел по умолчанию группирует разряды: значение 1234567,89 выводится как «1 234 567,89». Разделитель групп — неразрывный пробел, а не обычный. То же самое происходит в Excel, в бухгалтерских выгрузках, в интернет-банках: человеку читать удобно, а программа такую строку числом не считает.
Функция Число() во встроенном языке строгая: она принимает строку только в «каноническом» виде — цифры, необязательный минус и одна точка как разделитель дробной части. Любой посторонний символ, включая пробел, запятую-разделитель тысяч или символ валюты, приводит к ошибке преобразования либо к тихому возврату 0 — в зависимости от контекста (в выражениях запроса и при присваивании реквизиту поведение может отличаться).
Отдельная ловушка — разделитель дробной части. В российских выгрузках дробная часть часто отделена запятой («1 234,56»), а Число() ожидает точку. Поэтому полноценная очистка обычно включает и замену запятой на точку, если данные приходят из русскоязычных источников.
Базовый способ: СтрЗаменить и Число
Самый надёжный вариант — последовательно убрать все возможные виды пробелов и только потом преобразовывать строку. Порядок замен не важен, но набор символов должен быть полным, иначе часть данных «проскочит» с мусором.
СтрокаЧисла = "1 234 567,89";
// Убираем все виды пробелов
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", ""); // обычный пробел, код 32
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), ""); // неразрывный пробел
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(8239), ""); // узкий неразрывный пробел
// Приводим разделитель дробной части к точке
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", ".");
Результат = Число(СтрокаЧисла); // 1234567.89
Если строка гарантированно содержит число, этого достаточно. Если данные приходят из внешнего источника и могут быть пустыми или содержать текст, оберните преобразование в Попытка ... Исключение, чтобы одна «битая» строка не останавливала всю загрузку.
Функция СтрокаВЧисло(Строка)
Строка = СтрЗаменить(Строка, " ", "");
Строка = СтрЗаменить(Строка, Символ(160), "");
Строка = СтрЗаменить(Строка, Символ(8239), "");
Строка = СтрЗаменить(Строка, ",", ".");
Возврат Число(Строка);
КонецФункцииКак не допустить пробелы при выводе числа: форматная строка
Если проблема не во входных данных, а в том, что ваша программа сама формирует число с пробелами — например, для файла обмена, где разделители разрядов запрещены, — используйте функцию Формат() с параметром ЧГ=0 (ЧГ — разделитель групп, 0 означает «не группировать»).
Сумма = 1234567.89;
СтрокаСПробелами = Формат(Сумма, "ЧДЦ=2"); // "1 234 567,89"
СтрокаБезПробелов = Формат(Сумма, "ЧДЦ=2; ЧГ=0"); // "1234567,89"
// Вариант с точкой как разделителем дробной части
СтрокаДляXML = Формат(Сумма, "ЧРД=.; ЧДЦ=2; ЧГ=0"); // "1234567.89"
Тот же параметр доступен в свойствах полей формы и ячеек табличного документа: в палитре свойств найдите «Формат», откройте конструктор форматной строки и снимите флажок группировки разрядов (или вручную пропишите ЧГ=0). Это избавит от пробелов в печатных формах и в отчётах, выгружаемых в электронном виде.
Для реквизитов объектов с типом «Число» проблема вывода вообще не стоит: в базе хранится само число, а не строка, и группировка применяется только визуально в интерфейсе. Убирать пробелы нужно лишь там, где число превращается в текст.
Чистка данных при загрузке из Excel и внешних файлов
При чтении Excel через COM-объект или через табличный документ ячейка с числом нередко приходит как строка «12 500,00». Причина — формат ячейки «Текстовый» либо то, что значение читается как отображаемый текст, а не как сырое значение. Если читаете через ТабличныйДокумент, обращайтесь к свойству Значение области, а не к Текст — значение уже будет типа Число, и чистка не понадобится.
Если доступно только текстовое представление, применяйте функцию очистки из раздела выше. Дополнительно в банковских и складских выгрузках встречаются: символ валюты («1 234,56 руб.»), знак минус нестандартного вида (длинное тире вместо дефиса) и пробел в конце строки. Их тоже стоит удалять явно.
- 1Прочитайте значение ячейки; если доступно свойство Значение — используйте его вместо Текст
- 2Удалите обычный, неразрывный и узкий неразрывный пробелы через СтрЗаменить
- 3Уберите символы валюты и прочие посторонние знаки, замените запятую на точку
- 4Преобразуйте через Число() внутри блока Попытка/Исключение
- 5Запишите в журнал строки, которые не преобразовались, чтобы проверить их вручную
Для CSV-файлов дополнительно проверьте, не используется ли пробел как разделитель колонок. Если да — сначала разбивайте строку на колонки (СтрРазделить), и только потом чистите каждое значение, иначе удаление пробелов склеит соседние поля.
Проверка, что строка действительно стала числом
После очистки полезно убедиться, что преобразование прошло корректно, а не дало 0 из-за пропущенного символа. Простейший контроль — сравнить длину исходной строки и состав её символов: после очистки в строке должны остаться только цифры, точка и, возможно, минус в начале.
Как проверить результат очистки
Только цифры, одна точка, минус в начале
Остались пробелы, буквы, символы валюты
Возвращает ожидаемое значение, дробная часть на месте
Возвращает 0 или целую часть без дробной
Минус сохранился, число отрицательное
Минус потерян при замене тире, число стало положительным
Для массовой загрузки удобен вариант с контрольной суммой: сложите все преобразованные значения и сверьте с итогом, указанным в исходном файле (если он там есть). Расхождение сразу покажет, что часть строк потерялась или обрезалась.
Ещё один способ валидации — функция ОписаниеТипа с методом ПривестиЗначение(): она мягче Число() и не выбрасывает исключение, но тоже вернёт 0 для «грязной» строки, поэтому предварительная очистка всё равно обязательна.
Типичные ошибки и ограничения
Важное ограничение СтрЗаменить(): функция заменяет все вхождения подстроки, поэтому она безопасна для чисел, но опасна, если применить её к произвольному тексту — удалятся все пробелы подряд. Применяйте очистку только к полям, которые заведомо содержат числа.
Также учтите, что Число() не понимает экспоненциальную запись вида «1,5E+06» в некоторых контекстах и не воспринимает разделитель тысяч-апостроф («1'234'567»), который встречается в выгрузках швейцарских и некоторых ERP-систем. Такие случаи обрабатываются дополнительными заменами.
Выбор подхода под вашу задачу
Как выбрать действие
Если очистка чисел нужна в нескольких местах конфигурации, вынесите её в общий модуль как функцию СтрокаВЧисло() — пример приведён выше. Это избавит от дублирования и гарантирует, что во всех точках загрузки обрабатывается одинаковый набор символов.
Для разовых задач (например, консольская обработка или ручная правка данных) подойдёт внешняя обработка с тем же кодом: вставили строку — получили число. Это безопасно и не требует изменения конфигурации.
Что важно запомнить
Пробел в числе — почти всегда неразрывный (Символ(160)) или узкий неразрывный (Символ(8239)) пробел. Убирайте все три вида через СтрЗаменить, заменяйте запятую на точку и преобразуйте через Число() в блоке Попытка. Чтобы пробелы не появлялись при выводе, используйте Формат() с параметром ЧГ=0.
Частые вопросы
Почему СокрЛП не убирает пробелы в числе?
СокрЛП обрезает пробельные символы только по краям строки. Пробелы между разрядами находятся внутри, поэтому функция их не затрагивает. Используйте СтрЗаменить для удаления символов в любом месте строки.
Число() возвращает 0, хотя пробелы убрал. Что не так?
Скорее всего, в строке остался неразрывный пробел (код 160) или узкий неразрывный (код 8239), либо дробная часть отделена запятой. Проверьте строку посимвольно через КодСимвола() и добавьте недостающие замены.
Как убрать пробелы в числе в запросе 1С?
В языке запросов нет аналога СтрЗаменить. Стандартный путь — выгрузить результат запроса и обработать строки в коде, либо хранить значения изначально как числа, а не как строки, чтобы проблема не возникала.
Как вывести число без пробелов в печатной форме?
Откройте свойства ячейки табличного документа, найдите «Формат» и добавьте параметр ЧГ=0 (например, «ЧДЦ=2; ЧГ=0»). Либо формируйте строку в коде через Формат(Сумма, "ЧГ=0") и выводите её как текст.
Как определить, какой именно пробел стоит в строке?
Пройдите по строке циклом и выведите КодСимвола(Строка, Н) для каждого символа. Обычный пробел — 32, неразрывный — 160, узкий неразрывный — 8239, табуляция — 9. Зная код, добавьте точную замену.
Можно ли убрать пробелы сразу во всех данных справочника?
Да, обработкой: переберите элементы, очистите строковое поле через СтрЗаменить и запишите объект. Перед массовым изменением сделайте резервную копию базы и сначала проверьте обработку на нескольких элементах.