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

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

При разработке механизмов интеграции 1С с внешними сайтами и сервисами через API (REST, SOAP и др.) программисты часто сталкиваются с тем, что принимающая сторона выдает ошибку при получении числовых данных. Одной из самых коварных причин является автоматическое форматирование чисел в 1С. Например, вместо ожидаемого числа 4938 сервер получает строку "4 938". Лишний символ между цифрами делает данные невалидными для веб-сервера. В этой статье мы подробно разберем, почему это происходит и как правильно подготовить числовые данные для обмена.

Разберем природу проблемы: почему появляется пробел?

В платформе 1С реализована мощная система интернационализации. Согласно региональным установкам (например, для России), большие числа для удобства визуального восприятия разделяются на группы по три разряда. Символ, который мы видим как пробел между 4 и 938, в большинстве случаев не является обычным пробелом (клавиша Space, код 32). Это неразрывный пробел (код 160).

Проанализируем ситуацию: когда мы используем стандартное преобразование Строка(Число) или выводим число в поле, которое неявно преобразуется в текст, 1С применяет правила текущего сеанса. Для пользовательского интерфейса это хорошо, но для программного кода API — критично. Веб-сервер ожидает либо "чистый" набор цифр в строке, либо числовой тип в формате JSON, где любые разделители, кроме десятичной точки, запрещены.

Метод 1: Использование функции Формат

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

Посмотрим на пример кода:


// Исходное число
ЧислоID = 4938;

// Преобразование в строку без пробелов
СтрокаДляAPI = Формат(ЧислоID, "ЧГ=0");

// Результат будет "4938" без лишних символов
HTTPЗапрос.Заголовки.Вставить("Client-Id", СтрокаДляAPI);

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

Метод 2: Универсальный способ через XMLСтрока

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

Преимущества этого метода:

  1. Он полностью игнорирует региональные настройки текущего пользователя или сервера.
  2. Число всегда выводится без разделителей групп.
  3. В качестве десятичного разделителя всегда используется точка (что важно для дробных чисел в API).

Рассмотрим пример использования:


ЧислоЗначение = 12500.50;
// XMLСтрока вернет "12500.5"
СтрокаЗначение = XMLСтрока(ЧислоЗначение);
HTTPЗапрос.Заголовки.Вставить("Amount", СтрокаЗначение);

Именно XMLСтрока() часто называют "золотым стандартом" при подготовке данных для интеграций, так как она гарантирует идентичный результат вне зависимости от того, на каком сервере или под какими настройками запущен код 1С.

Метод 3: Очистка строки от неразрывных пробелов

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

Выясним, как правильно удалить такие символы:


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

Использование системной константы Символы.НПП позволяет гарантированно избавиться от типового разделителя групп 1С.

Работа с JSON: Тело запроса против Заголовков

Рассмотрим важный нюанс, упомянутый в обсуждении. Если вы передаете число в теле (Body) запроса в формате JSON, ситуация может отличаться.

Если вы формируете JSON вручную (через склейку строк), вы рискуете допустить ошибку с пробелами. Однако, если использовать объект ЗаписьJSON, платформа сама позаботится о правильном формате:


Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("client_id", 4938);

// Платформа сама запишет это как число без кавычек и без пробелов
ЗаписатьJSON(Запись, СтруктураДанных);
РезультатJSON = Запись.Закрыть();

Если же сервер требует передачи client_id в заголовках, то помните: заголовок — это всегда строка. Ошибка автора темы заключалась в том, что он пытался передать "число как число" там, где оно в любом случае превращается в текст. В этом случае использование Формат(ID, "ЧГ=0") является абсолютно правильным и единственно верным решением.

Почему нельзя просто изменить региональные настройки?

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

Вывод: Никогда не меняйте глобальные настройки системы ради решения локальной задачи интеграции. Используйте программные методы преобразования типов.

Подведем итоги

Для корректной передачи чисел в API без лишних отступов и пробелов мы рекомендуем:

  1. Для HTTP-заголовков использовать Формат(Число, "ЧГ=0") или XMLСтрока(Число).
  2. Для формирования JSON в теле запроса использовать объект ЗаписьJSON, который автоматически соблюдает стандарты типов данных.
  3. Всегда проверять, не является ли "пробел" в строке неразрывным (Символы.НПП), если вы используете ручную очистку строк.

Понимание того, как 1С работает с типами данных и их строковым представлением, позволяет создавать надежные системы обмена данными, которые не "ломаются" при смене сервера или обновлении платформы.

← На главную