Как задать формат числа в 1С, чтобы выгрузить его в текстовый файл без пробелов?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выгрузке числовых данных из системы «1С:Предприятие» в текстовые файлы (такие как TXT, CSV или кастомные форматы обмена) разработчики часто сталкиваются с неприятной особенностью: числа выгружаются с пробелами между триадами (например, вместо 18098 получается 18 098). Для внешних систем, принимающих этот файл, подобный пробел является недопустимым символом, что приводит к критическим ошибкам импорта.

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

Способ 1. Применение функции Формат() и управление параметром ЧГ

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

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

Рассмотрим практический пример кода:


ЧислоДляВыгрузки = 18098.45;

// Простейший вариант отключения группировки разрядов:
СтрокаБезПробелов = Формат(ЧислоДляВыгрузки, "ЧГ=0");
// Результат: "18098,45" (разделитель дробной части зависит от настроек операционной системы)

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


// ЧЦ=15 — максимальная длина числа (включая дробную часть)
// ЧДЦ=2 — ровно два знака в дробной части (недостающие будут дополнены нулями)
// ЧРД='.' — в качестве разделителя дробной части принудительно устанавливается точка
// ЧГ=0 — группировка разрядов полностью отключается (убирает пробелы)
ФорматнаяСтрока = "ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=0";

ИтоговаяСтрока = Формат(ЧислоДляВыгрузки, ФорматнаяСтрока);
// Результат: "18098.45"

Способ 2. Использование интерактивного Конструктора форматной строки

Если вам тяжело писать параметры форматной строки вручную по памяти, платформа предлагает удобный визуальный помощник. Разберем по шагам, как им воспользоваться в конфигураторе 1С:

  1. В окне редактирования модуля напишите вызов функции Формат(ИмяПеременной, "") и установите курсор внутрь пустых кавычек, предназначенных для форматной строки.
  2. Нажмите правую кнопку мыши для вызова контекстного меню и выберите пункт «Конструктор форматной строки...».
  3. В открывшемся окне перейдите на вкладку «Число».
  4. Найдите параметр «Группировка» и снимите с него флажок (или выберите значение «Не использовать»). В поле предварительного просмотра в нижней части окна вы сразу увидите, как исчезают пробелы из тестового числа.
  5. При необходимости настройте другие параметры: количество знаков в дробной части, лидирующие нули или символ разделителя дробной части.
  6. Нажмите кнопку «ОК». Платформа автоматически сформирует и подставит правильное выражение в ваш код.

Способ 3. Использование функции XMLСтрока() для быстрой сериализации

Если перед вами стоит задача максимально быстро преобразовать число в строку без форматирования, группировок разрядов и с точкой в качестве разделителя дробной части, идеальным решением станет использование специализированной функции глобального контекста XMLСтрока().

Посмотрим на пример работы этой функции:


ИсходноеЧисло = 18098.5;
СтрокаДляВыгрузки = XMLСтрока(ИсходноеЧисло);
// Результат: "18098.5"

Выясним причину, почему этот способ так популярен среди разработчиков. Функция XMLСтрока() выполняет преобразование строго по стандартам XML-сериализации. Это гарантирует:

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

Подводный камень: Почему СтрЗаменить() со стандартным пробелом не работает?

Очень частая ошибка при попытке убрать пробелы вручную выглядит следующим образом:

ОчищенноеЧисло = СтрЗаменить(Строка(Число), " ", "");

Разработчик запускает этот код, но пробелы в строке все равно остаются. Выясним причину этого странного поведения. Дело в том, что при стандартном преобразовании числа в строку платформа 1С использует для разделения разрядов не обычный пробел (код ASCII 32), а специальный неразрывный пробел (символ Юникода с кодом 160).

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


СтрокаСПробелами = Строка(18098);

// Вариант А: Использование системной константы Символы.НПП
ОчищеннаяСтрока = СтрЗаменить(СтрокаСПробелами, Символы.НПП, "");

// Вариант Б: Использование функции Символ() с кодом 160
ОчищеннаяСтрока = СтрЗаменить(СтрокаСПробелами, Символ(160), "");

Хотя этот способ рабочий, использовать ручную замену символов для форматирования чисел крайне не рекомендуется. Гораздо более профессионально и надежно сразу формировать строку нужного формата с помощью Формат() или XMLСтрока().

Продвинутый сценарий: Форматирование чисел для файлов фиксированной длины (лидирующие нули)

При интеграции со старыми банковскими системами или государственными порталами часто требуется выгружать числа в формате фиксированной длины, где незаполненное пространство слева заполняется нулями (например, число 18098 в поле длиной 8 символов должно выглядеть как 00018098).

Если мы попытаемся использовать для этого параметр форматной строки ЧВН= (выводить лидирующие нули), но забудем отключить группировку, мы получим некорректный результат: "00 018 098". Платформа честно дополнит строку нулями, но также расставит между ними неразрывные пробелы.

Правильный шаблон форматной строки для таких задач выглядит так:


ИсходноеЧисло = 18098;
// ЧЦ=8 — общая длина строки на выходе
// ЧГ=0 — отключаем разделители групп
// ЧВН= — включаем заполнение лидирующими нулями
ФорматированноеЧисло = Формат(ИсходноеЧисло, "ЧЦ=8; ЧГ=0; ЧВН=");
// Результат: "00018098"

Альтернативные и современные методы обмена данными

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

При использовании встроенных объектов платформы, таких как ЗаписьJSON или ЗаписьXML, вам вообще не придется задумываться о ручном форматировании чисел. Платформа осуществляет низкоуровневую сериализацию автоматически по международным стандартам:


Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();

Данные = Новый Структура;
Данные.Вставить("Код", 18098);
Данные.Вставить("Сумма", 1500.50);

ЗаписатьJSON(Запись, Данные);
Результат = Запись.Закрыть();
// В результирующей строке JSON числа запишутся как 18098 и 1500.5 абсолютно без пробелов
← На главную