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

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

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

Как в 1С преобразовать число в строку без пробелов: функции Формат, СтрЗаменить, Строка, параметры ЧГ и ЧРД. Примеры кода, типичные ошибки и FAQ.

При преобразовании числа в строку встроенный язык 1С по умолчанию группирует разряды и вставляет между ними неразрывные пробелы: число 1234567,89 превращается в «1 234 567,89». Для печатных форм такой вид удобен, но при выгрузке данных в файлы, обмене с внешними системами, формировании штрихкодов или запросов к API пробелы недопустимы — принимающая сторона не распознает значение.

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

Ниже разобраны все основные приёмы с примерами кода, указаны ограничения каждого подхода и типичные ошибки, из-за которых пробелы появляются снова или данные искажаются.

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

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

Из-за этого нюанса конструкция СтрЗаменить(С, " ", "") с обычным пробелом в кавычках часто не срабатывает — в строке просто нет символа с кодом 32. Это самая частая причина «неработающего» кода у начинающих разработчиков.

Группировка применяется только к целой части числа. Дробная часть отделяется запятой (в русских региональных настройках) и пробелами не разбивается. Поэтому проблема касается чисел от тысячи и выше — малые значения преобразуются без лишних символов.

Строка вида «1 234 567»Включена группировка разрядов

Используйте Формат с параметром ЧГ=0

Замена обычного пробела не работаетВ строке неразрывный пробел (код 160)

Заменяйте Символ(160), а не обычный пробел

В выгрузке запятая вместо точкиРегиональный разделитель дробной части

Добавьте параметр ЧРД=. в функцию Формат

Способ 1: функция Формат с параметром ЧГ=0

Основной и рекомендуемый метод — функция Формат() с явным указанием форматной строки. Параметр ЧГ=0 отключает группировку разрядов, и число выводится сплошным набором цифр:

Число = 1234567.89;

Результат = Формат(Число, "ЧГ=0");

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

Форматная строка позволяет комбинировать несколько параметров. Например, одновременно убрать пробелы и заменить запятую на точку, что требуется для большинства обменных форматов и SQL-запросов:

Результат = Формат(Число, "ЧГ=0; ЧРД=.");

// Результат: "1234567.89"

Полезные дополнительные параметры: ЧЦ — общее количество знаков, ЧДЦ — количество знаков дробной части, ЧН — представление нуля. Пример для выгрузки суммы с фиксированной точностью в два знака:

Результат = Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0");

// 1234567.9 -> "1234567.90"

bsl
Результат = Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0");

Способ 2: СтрЗаменить для готовой строки

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

ИсходнаяСтрока = Строка(1234567.89); // "1 234 567,89"

Результат = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");

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

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

Результат = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");

Результат = СтрЗаменить(Результат, " ", "");

У этого способа есть ограничение: он не управляет форматом числа, а лишь чистит текст. Округление, замена разделителя дробной части и дополнение нулями остаются на вашей совести, поэтому для новых разработок предпочтительнее Формат().

Способ 3: XMLСтрока и выгрузка в обменные форматы

При подготовке данных для XML, JSON или XDTO используйте функцию XMLСтрока(). Она возвращает каноническое строковое представление значения по правилам XML Schema: без группировки и с точкой в качестве разделителя дробной части:

Результат = XMLСтрока(1234567.89);

// Результат: "1234567.89"

Этот вариант особенно уместен в механизмах обмена, где принимающая система ожидает строгий формат. Обратная функция XMLЗначение() корректно восстановит число из такой строки. Для обычных печатных форм и сообщений пользователю XMLСтрока не подходит — пользователь привык видеть запятую и читаемую группировку.

Сравнение способов

Формат с ЧГ=0

Универсальный: управляет округлением, разделителем, длиной. Подходит почти всегда.

СтрЗаменить с Символ(160)

Для чистки уже готовых строк. Не управляет форматом числа.

XMLСтрока

Для обмена XML/JSON и веб-сервисов. Даёт канонический вид с точкой, не для показа пользователю.

Дополнение нулями до фиксированной длины

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

НомерДокумента = 12345;

Результат = Формат(НомерДокумента, "ЧЦ=10; ЧВН=; ЧГ=0");

// Результат: "0000012345"

Для целых значений, например номеров документов, есть альтернатива — обработка строки в цикле или через Строка() с добивкой. Но форматная строка короче и не требует дополнительных вычислений длины.

Учтите: если число не помещается в заданную разрядность ЧЦ, лишние разряды не отсекаются молча — поведение зависит от сочетания параметров, поэтому всегда проверяйте длину результата на максимальных значениях ваших данных.

Порядок действий
  1. 1
    Определите требования принимающей системы: разделитель дробной части, точность, фиксированная длина
  2. 2
    Сформируйте строку через Формат с параметрами ЧГ=0 и при необходимости ЧРД, ЧЦ, ЧДЦ
  3. 3
    Проверьте результат на числе с разрядами тысяч и миллионов, а также на нуле и дробном значении
  4. 4
    Убедитесь, что в строке нет символа 160: сравните длину строки с ожидаемым количеством цифр

Проверка результата и контрольные точки

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

Если СтрНайти(Результат, Символ(160)) > 0 Тогда

// в строке остался неразрывный пробел

КонецЕсли;

Если СтрДлина(Результат) <> ОжидаемаяДлина Тогда

// длина не соответствует формату обмена

КонецЕсли;

Дополнительная проверка — обратное преобразование: Число(Результат) должно вернуть исходное значение без потерь. Если функция вызывает исключение или возвращает другое число, формат строки не соответствует ожиданиям.

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

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

Поиск неразрывного пробела в строке
Норма

СтрНайти(Результат, Символ(160)) = 0

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

Функция вернула позицию больше нуля — пробелы остались

Длина строки
Норма

Совпадает с ожидаемой по формату обмена

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

Длина больше — есть лишние символы, меньше — потеряны разряды

Обратное преобразование Число(Результат)
Норма

Возвращает исходное значение

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

Исключение или другое число — неверный разделитель или лишние символы

Типичные ошибки и ограничения

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

Вторая ошибка — забытый разделитель дробной части. Строка «1234567,89» с запятой корректна для пользователя, но SQL-сервер, JSON-сервис или банковский формат ожидают точку. Добавляйте ЧРД=. при любой машинной выгрузке.

Третья ошибка — потеря точности при больших числах. Если параметр ЧЦ меньше реального количества разрядов, часть цифр может быть заменена или отсечена в зависимости от настроек. Задавайте разрядность с запасом относительно максимально возможных значений в данных.

Наконец, не применяйте Формат к значениям, которые уже являются строками, — функция предназначена для дат, чисел и булево. Перед преобразованием убедитесь в типе значения через ТипЗнч(), особенно если данные приходят из запроса с возможными NULL.

Типичные ошибки
01
Замена обычного пробела вместо Символ(160) — строка не меняется, ошибка всплывает у приёмника данных
02
Отсутствие ЧРД=. при машинной выгрузке — запятая ломает парсинг JSON, SQL или банковского формата
03
Заниженный параметр ЧЦ — старшие разряды больших чисел теряются или искажаются
04
Применение Формат к строке или NULL вместо числа — неожиданный результат или исключение

FAQ

Почему СтрЗаменить со обычным пробелом не убирает разделители разрядов?

Платформа 1С при группировке разрядов вставляет неразрывный пробел с кодом 160, а не обычный пробел с кодом 32. Используйте СтрЗаменить(Строка, Символ(160), "") или сразу формируйте строку через Формат с параметром ЧГ=0.

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

Передайте в функцию Формат оба параметра: Формат(Число, "ЧГ=0; ЧРД=."). Параметр ЧГ=0 отключает группировку, ЧРД=. задаёт точку как разделитель дробной части.

Чем XMLСтрока отличается от Формат при работе с числами?

XMLСтрока возвращает каноническое представление по стандарту XML Schema: без группировки и всегда с точкой. Формат гибче — позволяет управлять округлением, длиной, ведущими нулями и представлением нуля, но требует явного указания параметров.

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

Используйте Формат(Число, "ЧЦ=10; ЧВН=; ЧГ=0"). Параметр ЧВН включает вывод ведущих нулей, ЧЦ=10 задаёт общую длину, ЧГ=0 убирает группировку. Результат для числа 12345 — строка «0000012345».

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

Функция Число не воспринимает пробелы-разделители и в ряде случаев запятую как разделитель. Сначала удалите Символ(160) и при необходимости замените запятую на точку, затем выполняйте преобразование. Либо сразу формируйте строку в машинном формате через Формат с ЧГ=0 и ЧРД=.

Работает ли параметр ЧГ=0 в запросах и СКД?

В языке запросов функции Формат нет — там преобразование выполняется функцией ПРЕДСТАВЛЕНИЕ, которая не управляет группировкой. Если нужен строгий формат, обрабатывайте результат запроса в коде после выборки. В СКД формат поля задаётся в настройках оформления поля на закладке «Наборы данных» или в пользовательских настройках.

Итог

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

Базовое решение — Формат(Число, "ЧГ=0"); для машинных выгрузок добавляйте ЧРД=. и контролируйте разрядность через ЧЦ и ЧДЦ. При чистке готовых строк заменяйте неразрывный пробел Символ(160), а не обычный. Всегда проверяйте результат поиском лишних символов и обратным преобразованием.