Как в 1С получить строку из числа без пробелов и лишних символов?

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

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

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

Выясняем причину: откуда берутся пробелы в числах?

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

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

Из-за этой особенности стандартная функция очистки строки от пробелов или простая замена обычного пробела не приносят результата:


// Этот код НЕ удалит разделители триад в числе!
ЧислоСтрокой = Строка(1500000); // Результат: "1 500 000"
ЧистаяСтрока = СтрЗаменить(ЧислоСтрокой, " ", ""); // Результат останется прежним: "1 500 000"

Если вам по какой-то причине необходимо очистить уже готовую строку от неразрывных пробелов «постфактум», нужно явно указывать системный символ неразрывного пробела:


// Рабочий вариант ручной очистки строки
ЧислоСтрокой = Строка(1500000);
ЧистаяСтрока = СтрЗаменить(ЧислоСтрокой, Символы.НПП, ""); // Результат: "1500000"

Однако ручная замена символов в строке — это не самый производительный и элегантный метод. Платформа предоставляет гораздо более мощные и специализированные инструменты.

Решение 1: Использование универсальной функции Формат()

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

  1. ЧДЦ (Число десятичных цифр): указывает, сколько знаков после запятой оставить. Для получения только целой части мы задаем значение ЧДЦ=0.
  2. ЧГ (Группировка разрядов): определяет, как группировать цифры. Чтобы полностью отключить группировку (убрать пробелы), нужно передать значение ЧГ=0. Обратите внимание, что передача пустой строки или пробела может привести к непредсказуемым результатам в зависимости от региональных настроек системы.
  3. ЧН (Представление нуля): определяет, что вернет функция, если число равно нулю. По умолчанию функция может вернуть пустую строку. Чтобы гарантированно получить символ "0", используйте ЧН=0.

Давайте посмотрим на пример построения правильной форматной строки:


Число = 12500.85;
// Преобразуем число, убирая дробную часть и группировку разрядов
СтрокаБезПробелов = Формат(Число, "ЧДЦ=0; ЧГ=0; ЧН=0"); 
// Результат: "12501" (произошло математическое округление!)

Внимание: обратите внимание, что функция Формат() с параметром ЧДЦ=0 выполняет математическое округление числа по правилам округления платформы. Если исходное число было 76.5, то на выходе мы получим строку "77". Если вам нужно получить именно целую часть без округления (то есть отсечь дробную часть), перед форматированием обязательно примените функцию Цел().


Число = 76.5;
// Сначала выделяем целую часть, затем форматируем
ЦелаяЧасть = Цел(Число); // Результат: 76
СтрокаБезПробелов = Формат(ЦелаяЧасть, "ЧДЦ=0; ЧГ=0; ЧН=0"); // Результат: "76"

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

Решение 2: Безопасная обработка пустых значений, Неопределено и Null

В реальной практике данные часто приходят из незаполненных реквизитов объектов, баз данных или внешних источников. Если переменная содержит значение Неопределено или Null, прямая передача такого значения в функцию Цел() вызовет критическую ошибку выполнения (Runtime Error) «Несоответствие типов».

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


СтрокаНеопределено = Формат(Неопределено, "ЧДЦ=0; ЧГ=0; ЧН=0"); // Вернет пустую строку ""

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


// Функция возвращает строковое представление целой части числа без пробелов
Функция ПолучитьЧислоСтрокойБезПробелов(ЗначениеЧисла) Экспорт
    
    Если ТипЗнч(ЗначениеЧисла) = Тип("Число") Тогда
        Возврат Формат(Цел(ЗначениеЧисла), "ЧДЦ=0; ЧГ=0; ЧН=0");
    Иначе
        // Если передано Неопределено, Null или другой тип, возвращаем пустую строку
        Возврат "";
    КонецЕсли;
    
КонецФункции

Для лаконичности кода в простых выражениях можно использовать тернарный оператор ?():


РезультатСтрокой = ?(ТипЗнч(ИсходноеЧисло) = Тип("Число"), Формат(Цел(ИсходноеЧисло), "ЧДЦ=0; ЧГ=0; ЧН=0"), "");

Решение 3: Идеальный способ для XML и веб-интеграций — XMLСтрока()

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

Функция Формат() по умолчанию ориентируется на настройки операционной системы, на которой запущен сеанс 1С (клиентский компьютер или сервер приложений). Если локально база работает под Windows с русским языком интерфейса, код может работать корректно. Но при переносе базы в "облако" (SaaS), где серверная часть может работать под управлением Linux с американской локалью (English US), те же самые функции форматирования могут начать возвращать другие разделители (например, точку вместо запятой или запятую вместо пробела в качестве разделителя тысяч).

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

Давайте разберем, как она работает:

Рассмотрим пример совместного использования функций для получения целой части числа для XML:


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

// Извлекаем целую часть без округления
ЦелоеЧисло = Цел(ЧислоДляВыгрузки); // Получаем 1500350

// Преобразуем в гарантированно чистую строку для XML
СтрокаДляТега = XMLСтрока(ЦелоеЧисло); // Результат: "1500350"

Использование XMLСтрока(Цел(Число)) является признаком хорошего тона при разработке интеграционных механизмов в 1С. Это решение экономит процессорное время, гарантирует отсутствие ошибок несоответствия форматов и стабильно работает вне зависимости от того, где развернута база данных — на локальном компьютере разработчика или на серверах облачного провайдера.

← На главную