Разработка и Конфигурация · 10 мин
Как в 1С преобразовать число в строку без пробелов
Как в 1С преобразовать число в строку без пробелов: функции Формат, СтрЗаменить, Строка, параметры ЧГ и ЧРД. Примеры кода, типичные ошибки и FAQ.
При преобразовании числа в строку встроенный язык 1С по умолчанию группирует разряды и вставляет между ними неразрывные пробелы: число 1234567,89 превращается в «1 234 567,89». Для печатных форм такой вид удобен, но при выгрузке данных в файлы, обмене с внешними системами, формировании штрихкодов или запросов к API пробелы недопустимы — принимающая сторона не распознает значение.
Существует несколько рабочих способов убрать группировку: функция Формат() с параметром отключения группировки, строковая замена СтрЗаменить(), а также комбинации с управлением разделителем дробной части. Выбор зависит от того, нужно ли дополнительно округлять значение, заменять запятую на точку и дополнять строку нулями до фиксированной длины.
Ниже разобраны все основные приёмы с примерами кода, указаны ограничения каждого подхода и типичные ошибки, из-за которых пробелы появляются снова или данные искажаются.
Почему в строке появляются пробелы
Когда вы пишете Строка(МоеЧисло) или просто используете число в строковом выражении, платформа применяет региональные настройки форматирования. По умолчанию включена группировка разрядов: каждые три цифры целой части отделяются символом. Важно понимать, что это не обычный пробел с кодом 32, а неразрывный пробел с кодом 160.
Из-за этого нюанса конструкция СтрЗаменить(С, " ", "") с обычным пробелом в кавычках часто не срабатывает — в строке просто нет символа с кодом 32. Это самая частая причина «неработающего» кода у начинающих разработчиков.
Группировка применяется только к целой части числа. Дробная часть отделяется запятой (в русских региональных настройках) и пробелами не разбивается. Поэтому проблема касается чисел от тысячи и выше — малые значения преобразуются без лишних символов.
Используйте Формат с параметром ЧГ=0
Заменяйте Символ(160), а не обычный пробел
Добавьте параметр ЧРД=. в функцию Формат
Способ 1: функция Формат с параметром ЧГ=0
Основной и рекомендуемый метод — функция Формат() с явным указанием форматной строки. Параметр ЧГ=0 отключает группировку разрядов, и число выводится сплошным набором цифр:
Число = 1234567.89;
Результат = Формат(Число, "ЧГ=0");
// Результат: "1234567,89"
Форматная строка позволяет комбинировать несколько параметров. Например, одновременно убрать пробелы и заменить запятую на точку, что требуется для большинства обменных форматов и SQL-запросов:
Результат = Формат(Число, "ЧГ=0; ЧРД=.");
// Результат: "1234567.89"
Полезные дополнительные параметры: ЧЦ — общее количество знаков, ЧДЦ — количество знаков дробной части, ЧН — представление нуля. Пример для выгрузки суммы с фиксированной точностью в два знака:
Результат = Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0");
// 1234567.9 -> "1234567.90"
Результат = Формат(Сумма, "ЧЦ=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Строка не подходит — пользователь привык видеть запятую и читаемую группировку.
Сравнение способов
Универсальный: управляет округлением, разделителем, длиной. Подходит почти всегда.
Для чистки уже готовых строк. Не управляет форматом числа.
Для обмена XML/JSON и веб-сервисов. Даёт канонический вид с точкой, не для показа пользователю.
Дополнение нулями до фиксированной длины
Частая задача обмена с банками, кассами и государственными системами — число должно занимать строго заданное количество позиций, дополненное нулями слева. Решается параметром ЧЦ совместно с ЧВН (вывод ведущих нулей):
НомерДокумента = 12345;
Результат = Формат(НомерДокумента, "ЧЦ=10; ЧВН=; ЧГ=0");
// Результат: "0000012345"
Для целых значений, например номеров документов, есть альтернатива — обработка строки в цикле или через Строка() с добивкой. Но форматная строка короче и не требует дополнительных вычислений длины.
Учтите: если число не помещается в заданную разрядность ЧЦ, лишние разряды не отсекаются молча — поведение зависит от сочетания параметров, поэтому всегда проверяйте длину результата на максимальных значениях ваших данных.
- 1Определите требования принимающей системы: разделитель дробной части, точность, фиксированная длина
- 2Сформируйте строку через Формат с параметрами ЧГ=0 и при необходимости ЧРД, ЧЦ, ЧДЦ
- 3Проверьте результат на числе с разрядами тысяч и миллионов, а также на нуле и дробном значении
- 4Убедитесь, что в строке нет символа 160: сравните длину строки с ожидаемым количеством цифр
Проверка результата и контрольные точки
После преобразования полезно программно убедиться, что строка чистая. Проверки занимают пару строк кода, но избавляют от бракованных выгрузок:
Если СтрНайти(Результат, Символ(160)) > 0 Тогда
// в строке остался неразрывный пробел
КонецЕсли;
Если СтрДлина(Результат) <> ОжидаемаяДлина Тогда
// длина не соответствует формату обмена
КонецЕсли;
Дополнительная проверка — обратное преобразование: Число(Результат) должно вернуть исходное значение без потерь. Если функция вызывает исключение или возвращает другое число, формат строки не соответствует ожиданиям.
Как проверить результат
СтрНайти(Результат, Символ(160)) = 0
Функция вернула позицию больше нуля — пробелы остались
Совпадает с ожидаемой по формату обмена
Длина больше — есть лишние символы, меньше — потеряны разряды
Возвращает исходное значение
Исключение или другое число — неверный разделитель или лишние символы
Типичные ошибки и ограничения
Первая ошибка — замена обычного пробела вместо неразрывного. Код отрабатывает без ошибок, но строка не меняется, и сбой обнаруживается только на стороне приёмника. Всегда используйте Символ(160) или избегайте ручной чистки в пользу Формат().
Вторая ошибка — забытый разделитель дробной части. Строка «1234567,89» с запятой корректна для пользователя, но SQL-сервер, JSON-сервис или банковский формат ожидают точку. Добавляйте ЧРД=. при любой машинной выгрузке.
Третья ошибка — потеря точности при больших числах. Если параметр ЧЦ меньше реального количества разрядов, часть цифр может быть заменена или отсечена в зависимости от настроек. Задавайте разрядность с запасом относительно максимально возможных значений в данных.
Наконец, не применяйте Формат к значениям, которые уже являются строками, — функция предназначена для дат, чисел и булево. Перед преобразованием убедитесь в типе значения через ТипЗнч(), особенно если данные приходят из запроса с возможными 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), а не обычный. Всегда проверяйте результат поиском лишних символов и обратным преобразованием.