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

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

Как удалить пробелы в числах в 1С

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

Пробелы в числах в 1С появляются в двух типичных ситуациях: платформа автоматически форматирует число с разделителями групп («1 234 567,89»), либо пробелы попадают в данные при загрузке из Excel, CSV, банковских выписок или при ручном вводе. В первом случае это только визуальное представление, во втором — реальные символы в строке, которые мешают сравнению, поиску и преобразованию в число.

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

Почему в числах появляются пробелы

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

Вторая причина — внешние данные. При загрузке из Excel, текстовых файлов, выписок банков или обменах с сайтами числа приходят как строки вида «1 250 000» или «12 500,00». Пока такая строка не очищена, функция Число() может вернуть ошибку преобразования или некорректный результат.

Третий источник — ручной ввод. Пользователи копируют суммы из писем и документов вместе с пробелами, и эти строки сохраняются в текстовых реквизитах. Позже это ломает сравнения, поиск по значению и выгрузки.

Удаление пробелов в коде через СтрЗаменить

Универсальный способ — функция СтрЗаменить(). Она заменяет все вхождения подстроки в строке и работает как на тонком клиенте, так и на сервере:

СтрокаСуммы = "1 234 567,89";

ЧистаяСтрока = СтрЗаменить(СтрокаСуммы, " ", "");

// Результат: "1234567,89"

Сумма = Число(ЧистаяСтрока);

Если данные пришли из Excel или веб-страниц, обычного пробела недостаточно — там часто встречается неразрывный пробел. Надёжный вариант — заменить оба символа:

СтрокаСуммы = "1 234 567,89";

ЧистаяСтрока = СтрЗаменить(СтрокаСуммы, " ", "");

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

Сумма = Число(ЧистаяСтрока);

Проверить, какой именно символ стоит между разрядами, можно функцией КодСимвола(): выделите подстроку между цифрами через Сред() и посмотрите код. Обычный пробел — 32, неразрывный — 160.

bsl
Функция СтрокаВЧисло(СтрокаСуммы)
    Результат = СтрЗаменить(СтрокаСуммы, " ", "");
    Результат = СтрЗаменить(Результат, Символ(160), "");
    Результат = СтрЗаменить(Результат, Символ(9), ""); // табуляция
    Попытка
        Возврат Число(Результат);
    Исключение
        Возврат 0;
    КонецПопытки;
КонецФункции

Удаление пробелов при выводе: форматная строка

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

Функция Формат()

Параметр ЧГ управляет группировкой разрядов. Значение 0 отключает разделитель групп полностью:

Сумма = 1234567.89;

Строка = Формат(Сумма, "ЧДЦ=2; ЧГ=0");

// Результат: "1234567,89"

Форматная строка в свойствах поля и макета

Тот же параметр указывается в свойстве «Формат» поля ввода, колонки таблицы значений на форме или ячейки табличного документа. Откройте свойства элемента, найдите поле «Формат», нажмите кнопку выбора и в конструкторе снимите группировку разрядов либо впишите вручную ЧДЦ=2; ЧГ=0.

Очистка пробелов при загрузке данных из файлов

При загрузке прайсов, выписок и таблиц Excel правильное место для удаления пробелов — момент чтения значения, до записи в базу. Так вы не накапливаете «грязные» строки в реквизитах.

Для Каждого СтрокаТаблицы Из ТаблицаЗагрузки Цикл

СуммаСтрокой = СтрокаТаблицы.Сумма;

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

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

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

НоваяСтрока.Сумма = Число(СуммаСтрокой);

КонецЦикла;

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

Порядок действий при загрузке
  1. 1
    Прочитайте значение из файла как строку
  2. 2
    Удалите обычные и неразрывные пробелы через СтрЗаменить
  3. 3
    Приведите разделитель дробной части к точке
  4. 4
    Преобразуйте через Число() внутри Попытка/Исключение
  5. 5
    Запишите результат и проверьте несколько контрольных строк

Исправление уже записанных данных

Если пробелы уже попали в строковые реквизиты справочников или документов, понадобится разовая обработка. Логика проста: перебрать объекты, очистить значение, записать.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка, АртикулСтрокой ИЗ Справочник.Номенклатура";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если СтрНайти(Выборка.АртикулСтрокой, " ") > 0 Тогда

Объект = Выборка.Ссылка.ПолучитьОбъект();

Объект.АртикулСтрокой = СтрЗаменить(Объект.АртикулСтрокой, " ", "");

Объект.Записать();

КонецЕсли;

КонецЦикла;

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

Типичные ошибки и их последствия

Самая частая ошибка — замена только обычного пробела, когда в данных неразрывный. Внешне строка выглядит очищенной, но Число() выдаёт ошибку или неверное значение, и причина неочевидна.

Вторая ошибка — использование СокрЛП() в надежде убрать пробелы внутри числа. СокрЛП удаляет пробелы только по краям строки, разделители между разрядами остаются на месте.

Третья — преобразование Число() без обработки исключений. Если в строке встретится буква, валютный символ или двойной разделитель, выполнение прервётся. Всегда оборачивайте преобразование в Попытка/Исключение и логируйте проблемные значения.

Типичные ошибки
01
Замена только символа 32: неразрывный пробел (160) остаётся, и Число() падает с ошибкой
02
Использование СокрЛП: убирает пробелы только по краям, не внутри числа
03
Число() без Попытка/Исключение: одно «грязное» значение останавливает всю загрузку
04
Замена запятой на точку до удаления пробелов в данных вида «1 234,56» — легко запутаться в порядке операций
05
Исправление формата отображения, когда пробелы реально хранятся в базе: данные остаются грязными

Проверка результата

После очистки убедитесь, что значения корректны. Для строкового результата проверьте отсутствие пробелов через СтрНайти(Результат, " ") = 0 и СтрНайти(Результат, Символ(160)) = 0. Для числового — сравните контрольные суммы: например, итог по колонке до и после обработки должен совпасть.

При загрузке из файла сверьте 3–5 случайных строк с исходным документом. Особое внимание — суммам с копейками и значениям больше миллиона: именно там чаще всего встречаются и разделители групп, и дробная часть одновременно.

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

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

Поиск пробела в очищенной строке
Норма

СтрНайти возвращает 0 для символов 32 и 160

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

Пробел найден — замена отработала не полностью

Преобразование в число
Норма

Число() выполняется без исключения, значение совпадает с исходным

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

Ошибка преобразования или потеря дробной части

Итоговая сумма по колонке
Норма

Совпадает с контрольной суммой источника

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

Расхождение — часть строк обработана неверно

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

Почему СтрЗаменить не убирает пробел, хотя он виден на экране?

Скорее всего, это неразрывный пробел (код 160), а не обычный (код 32). Определите код символа через КодСимвола(Сред(Строка, Позиция, 1)) и добавьте замену СтрЗаменить(Строка, Символ(160), "").

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

Да, если проблема только в отображении: откройте свойства поля или ячейки макета и в форматной строке задайте ЧГ=0. Если же пробелы хранятся в данных, без обработки или внешнего инструмента (например, групповой обработки реквизитов) не обойтись.

Чем отличается СокрЛП от СтрЗаменить для этой задачи?

СокрЛП удаляет пробельные символы только в начале и конце строки, а СтрЗаменить заменяет все вхождения по всей строке. Для разделителей разрядов внутри числа подходит только СтрЗаменить.

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

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

Как убрать пробелы в уже сформированном табличном документе?

Программно пройдите по областям документа и замените текст ячеек: ТабДок.Область(...).Текст = СтрЗаменить(Текст, " ", ""). Но правильнее исправить формат вывода на этапе формирования документа, чтобы не обрабатывать готовый результат.

Нужно ли удалять пробелы, если число хранится в реквизите с типом «Число»?

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

Итог

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

Пробелы в числах бывают двух видов: формат отображения (лечится параметром ЧГ=0) и реальные символы в строках (лечатся СтрЗаменить с учётом неразрывного пробела 160). Преобразование в число всегда выполняйте внутри Попытка/Исключение, а массовую обработку данных — только после резервной копии и теста на копии базы.