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

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

Как привести число к строке в 1С

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

Во встроенном языке 1С типы «Число» и «Строка» несовместимы: попытка сложить строку с числом через оператор «+» вызовет ошибку «Преобразование значения к типу Число не может быть выполнено». Поэтому перед конкатенацией, выводом в сообщение, записью в текстовый файл или передачей в HTTP-запрос число нужно явно преобразовать в строку.

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

Важный нюанс: при преобразовании больших чисел платформа вставляет разделители групп разрядов — неразрывные пробелы. Такая строка непригодна для машинной обработки (XML, JSON, запросы к API), и её нужно дополнительно очистить. Ниже разобраны все типовые сценарии с готовым кодом.

Базовое преобразование функцией Строка()

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

Цена = 1250.5;

ТекстСообщения = "Сумма заказа: " + Строка(Цена) + " руб.";

Сообщить(ТекстСообщения); // Сумма заказа: 1 250,5 руб.

Обратите внимание на результат: число 1250.5 превратилось в «1 250,5». Появился разделитель групп (неразрывный пробел между «1» и «250»), а дробная часть отделена запятой. Для сообщения пользователю это нормально, но для записи в файл или обмена данными — проблема.

Функция Строка() универсальна: она принимает значения любых типов (дата, булево, ссылка на объект), но именно для чисел её поведение чаще всего требует «доводки» — из-за разделителей разрядов и регионального формата десятичной части.

Контроль формата функцией Формат()

Функция Формат(Значение, ФорматнаяСтрока) — основной инструмент, когда нужен предсказуемый результат. Форматная строка состоит из параметров вида Имя=Значение, разделённых точкой с запятой.

Сумма = 1234567.891;

// Без разделителей групп, 2 знака после запятой

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

// С ведущими нулями, общая длина 10 символов

Результат = Формат(42, "ЧЦ=10; ЧВН="); // "0000000042"

Ключевые параметры форматной строки для чисел:

  • ЧЦ — общая длина поля вывода (включая разделители);
  • ЧДЦ — количество знаков в дробной части, лишние разряды округляются;
  • ЧГ — группировка разрядов: ЧГ=0 отключает разделители;
  • ЧВН — вывод ведущих нулей (параметр без значения);
  • ЧН — строка, выводимая вместо нуля, например ЧН=0,00;
  • ЧО — отображение отрицательных чисел.

Как убрать неразрывные пробелы из строки

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

ЧислоСтрокой = Строка(1234567.89); // "1 234 567,89"

// Удаляем неразрывный пробел по его коду

ЧистаяСтрока = СтрЗаменить(ЧислоСтрокой, Символ(160), "");

// Заодно заменяем обычный пробел — на случай других настроек

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

Более надёжный подход — не очищать строку постфактум, а сразу формировать её без разделителей через Формат(Число, "ЧГ=0"). Очистка через СтрЗаменить оправдана только тогда, когда источник строки вам неподконтролен.

Типичные ошибки
01
Конкатенация числа со строкой без преобразования — ошибка времени выполнения «Преобразование значения не может быть выполнено»
02
Забытый ЧГ=0 — в XML или JSON уходит строка «1 234 567,89», и приёмник не может распарсить число
03
Использование Строка() для обмена данными — формат зависит от региональных настроек сеанса, у разных пользователей результат разный
04
Замена обычного пробела вместо неразрывного — строка визуально не меняется, разделители остаются

Число в строку для обмена данными: XML, JSON, HTTP

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

// Надёжный вариант для обмена

Функция ЧислоВСтрокуДляОбмена(Знач Число)

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

Возврат Результат;

КонецФункции

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

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

Порядок действий
  1. 1
    Определите назначение строки: показ пользователю или машинная обработка
  2. 2
    Для пользователя: Строка(Число) или Формат() с нужным ЧДЦ
  3. 3
    Для обмена: Формат(Число, "ЧГ=0; ЧРД=.") — без разделителей, с точкой
  4. 4
    Проверьте результат на большом числе (более 999) и на отрицательном значении

Специальные сценарии форматирования

Ведущие нули для номеров документов

Когда нужно дополнить номер нулями слева до фиксированной длины (например, «0000123»), используйте сочетание ЧЦ и ЧВН:

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

СтрокаНомера = Формат(НомерДокумента, "ЧЦ=7; ЧВН=; ЧГ=0"); // "0000123"

Округление при выводе

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

Значение = 19.999;

Текст = Формат(Значение, "ЧДЦ=2; ЧГ=0"); // "20,00" — округление!

Представление нуля и пустых значений

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

Сравнение вариантов

Строка(Число)

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

Формат(Число, форматная строка)

Полный контроль: разряды, нули, разделители, представление нуля. Требует знания параметров, но это стандарт для серьёзного кода

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

Только как «заплатка» для строк, полученных извне. Хрупко: зависит от того, какой именно символ-разделитель использовался

Проверка результата и обратное преобразование

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

СтрокаЧисла = Формат(Значение, "ЧГ=0; ЧРД=.");

Попытка

Проверка = Число(СтрЗаменить(СтрокаЧисла, ".", ","));

// или Число(СтрокаЧисла) — зависит от настроек сеанса

Исключение

Сообщить("Строка не является числом: " + СтрокаЧисла);

КонецПопытки;

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

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

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

Большое число (более 999)
Норма

Строка без пробелов: «1234567,89»

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

В строке пробелы: «1 234 567,89»

Дробное число для обмена
Норма

Разделитель — точка: «19.99»

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

Запятая или непредсказуемый символ из настроек сеанса

Обратное преобразование
Норма

Число(Строка) возвращает исходное значение

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

Исключение или потеря точности

Частые вопросы

Почему Строка(Число) даёт запятую, а мне нужна точка?

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

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

В языке запросов прямого аналога Строка() нет. Используйте функцию ПОДСТРОКА с приведением, либо функцию ПРЕДСТАВЛЕНИЕ(Поле) — она возвращает строковое представление значения. Для чисел чаще применяют ВЫРАЗИТЬ(Поле КАК Строка(20)), но это работает не во всех СУБД, поэтому надёжнее преобразовывать уже в коде после выгрузки результата запроса.

Чем опасна конкатенация числа и строки без преобразования?

Оператор «+» между строкой и числом вызывает ошибку времени выполнения, и код останавливается. В отладчике это легко поймать, но в редко выполняемых ветках кода (обработчики ошибок, регламентные задания) такая ошибка может проявиться только в рабочей базе. Всегда оборачивайте число в Строка() или Формат().

Как вывести число прописью?

Для суммы прописью используется функция ЧислоПрописью(Число, ПараметрыПредметаИсчисления, ФорматнаяСтрока). Она формирует текст вроде «сто двадцать три рубля 45 копеек». Параметры предмета исчисления задают род и наименование валюты, форматная строка — язык и денежный формат.

Нужно ли преобразовывать число в строку при записи в JSON?

Нет. При использовании ЗаписьJSON и метода ЗаписатьЗначение платформа сама сериализует число как числовой литерал JSON. Если вы предварительно переведёте его в строку, в JSON уйдёт строковое значение в кавычках, и приёмник получит другой тип данных — это частая причина ошибок интеграции.

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

Удалите оба варианта последовательно: сначала СтрЗаменить(Строка, Символ(160), "") для неразрывного пробела, затем СтрЗаменить(Строка, " ", "") для обычного. Дополнительно можно проверить символ с кодом 8194 (типографский пробел), который встречается в некоторых локалях.

Итог

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

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